tutorial custom java spring spring-security

java - custom - spring security roles controller



¿Cómo uso los roles/autoridades personalizados en Spring Security? (5)

Al migrar una aplicación heredada a la seguridad Spring, obtuve la siguiente excepción:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''_filterChainProxy'': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''_filterChainList'': Cannot resolve reference to bean ''_filterSecurityInterceptor'' while setting bean property ''filters'' with key [3]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''_filterSecurityInterceptor'': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Unsupported configuration attributes: [superadmin] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)

En la aplicación anterior hay roles como "superadmin", "editor", "helpdesk", etc. Pero en todos los ejemplos de Spring Security solo veo roles como "ROLE_" ("ROLE_ADMIN", etc.). Cuando renombro "superadmin" a "ROLE_ADMIN" y solo uso este rol en la configuración, todo funciona.

No funciona

<http auto-config="true"> <intercept-url pattern="/restricted/**" access="superadmin"/> <form-login authentication-failure-url="/secure/loginAdmin.do?error=true" login-page="/secure/loginAdmin.do" /> </http>

Trabajos:

<http auto-config="true"> <intercept-url pattern="/restricted/**" access="ROLE_ADMIN"/> <form-login authentication-failure-url="/secure/loginAdmin.do?error=true" login-page="/secure/loginAdmin.do" /> </http>

¿Es posible usar nombres de roles personalizados?


Aquí hay una configuración completa usando expresiones de acceso (el enlace proporcionado por @rodrigoap parece un poco desactualizado):

<http access-decision-manager-ref="accessDecisionManager" use-expressions="true"> <beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> <beans:property name="decisionVoters"> <beans:list> <beans:bean class="org.springframework.security.web.access.expression.WebExpressionVoter"/> <beans:bean class="org.springframework.security.access.vote.RoleVoter"> <beans:property name="rolePrefix" value=""/> </beans:bean> <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter"/> </beans:list> </beans:property> </beans:bean>




También puede usar siempre la expresión (mediante config use-expressions="true" ) para ignorar el prefijo ROLE_ .

Después de leer el código fuente de Spring Security 3.1, encontré cuando use-expressions="true" :

Para <security:http > :
HttpConfigurationBuilder#createFilterSecurityInterceptor() registrará WebExpressionVoter pero no RoleVoterAuthenticatedVoter ;

Para <security:global-method-security > : GlobalMethodSecurityBeanDefinitionParser#registerAccessManager() se registrará PreInvocationAuthorizationAdviceVoter (condicionalmente), luego siempre regist RoleVoter AuthenticatedVoter , regist Jsr250Voter conditionally;

PreInvocationAuthorizationAdviceVoter procesará PreInvocationAttribute (PreInvocationExpressionAttribute se utilizará como implementación) que se genera de acuerdo con @PreAuthorize . PreInvocationExpressionAttribute#getAttribute() siempre devuelve nulo, por lo que RoleVoterAuthenticatedVoter no lo vota.


Usando Spring Security 3.2 , esto funcionó para mí.

Cambiar prefijo de rol:

<beans:bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter"> <beans:property name="rolePrefix" value="NEW_PREFIX_"/> </beans:bean> <beans:bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter"/> <beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> <beans:constructor-arg > <beans:list> <beans:ref bean="roleVoter"/> <beans:ref bean="authenticatedVoter"/> </beans:list> </beans:constructor-arg> </beans:bean>

Dependiendo de dónde desee aplicar el Prefijo de rol, se puede aplicar a nivel de esquema de seguridad o nivel de bean.

<http access-decision-manager-ref="accessDecisionManager" use-expressions="true">

Aplicar prefijo de rol en el nivel de servicio:

<beans:bean id="myService" class="com.security.test"> <security:intercept-methods access-decision-manager-ref="accessDecisionManager"> <security:protect access="NEW_PREFIX_ADMIN"/> </security:intercept-methods> </beans:bean>