@Secured lanza AccessDeniedException aunque los roles son correctos
-
22-07-2019 - |
Pregunta
Después de resolver todos los problemas relacionados con la autenticación en mi primera aplicación web de Spring ahora estoy atascado con la autorización.
La configuración usando las anotaciones @Secured
es bastante sencilla, así que no creo que haya cometido un error aquí. Además, estoy usando un Active Directory con el proveedor de autenticación LDAP y asigno roles por grupos de AD, por lo que tampoco es un problema.
Entonces, aquí hay un breve resumen de mi problema:
- Acciones no seguras work
- Acciones usando
@Secured (" IS_AUTHENTICATED_FULLY ")
work - Las acciones que usan algo como
@Secured (" GROUP _ * ")
no funcionan
Cuando se llama a una acción segura, se arroja un org.springframework.security.AccessDeniedException
. Aquí hay un extracto de los registros:
DEBUG: org.springframework.security.intercept.AbstractSecurityInterceptor - Secure object: ReflectiveMethodInvocation: public org.springframework.web.servlet.ModelAndView de.dillinger.resources.controllers.HostsController.index(); target is of class [de.dillinger.resources.controllers.HostsController]; ConfigAttributes: [GROUP_IT]
DEBUG: org.springframework.security.intercept.AbstractSecurityInterceptor - Previously Authenticated: org.springframework.security.providers.UsernamePasswordAuthenticationToken@2a5333d9: Principal: org.springframework.security.userdetails.ldap.Person@1422384: Username: di32001; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: GROUP_ITS, GROUP_ITS-IT, GROUP_INTERNET, GROUP_SYSTEMGRUPPE, GROUP_IT; Password: [PROTECTED]; Authenticated: true; Details: org.springframework.security.ui.WebAuthenticationDetails@0: RemoteIpAddress: 127.0.0.1; SessionId: 773943FFB14E512872BB6CE25F46C00A; Granted Authorities: GROUP_ITS, GROUP_ITS-IT, GROUP_INTERNET, GROUP_SYSTEMGRUPPE, GROUP_IT
Como puede ver, la acción requiere el rol GROUP_IT
y mi objeto de usuario tiene este privilegio. Realmente no sé qué está causando este problema.
Solución
¿Está utilizando org.springframework.security.access.vote.UnanimousBased
votante de rol? Intente cambiarlo a org.springframework.security.access.vote.AffirmativeBased
.
Este tipo de problemas están relacionados con la configuración del votante de roles.
Editar 1 (ejemplo agregado):
<security:global-method-security
secured-annotations="enabled"
access-decision-manager-ref="accessDecisionManager"
/>
<bean
id="accessDecisionManager"
class="org.springframework.security.access.vote.AffirmativeBased">
<property name="allowIfAllAbstainDecisions" value="false" />
<property name="decisionVoters">
<list>
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter" />
</list>
</property>
</bean>