2009-06-12 11 views
28

Al migrar una aplicación heredada a la primavera de seguridad me dio la siguiente excepción:¿Cómo uso las funciones/autoridades personalizadas en Spring Security?

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 antigua que hay papeles como "superadmin", "editor", "asistencia", etc. Sin embargo, en todos los ejemplos Spring Security Solo veo roles como "ROLE_" ("ROLE_ADMIN", etc.). Cuando cambio el nombre de "superadmin" por "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> 

Obras:

<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 utilizar nombres de roles personalizados?

+0

Esto [pregunta] (http://stackoverflow.com/questions/283870/acegi-security-how-do-i-add -otra autorización-grante-a-autenticación-a-anónimo) puede ayudar. – kgiannakakis

Respuesta

39

Está utilizando la configuración predeterminada que espera que los roles comiencen con el prefijo "ROLE_". Deberá agregar una configuración de seguridad personalizada y establecer rolePrefix en "";

http://forum.springsource.org/archive/index.php/t-53485.html

+0

¿puedo tener un ROLE_FOO o un ROLE_BAR o un ROLE_ANYTHING_I_WANT? El enlace que proporcionó no aborda el problema, es solo un tipo que dice "No se puede establecer RolePrefix para RoleVoter" –

+6

Sí, puede tener cualquier función que desee. El enlace muestra un ejemplo de configuración y puede no ser útil, pero fue útil para D. Wroblewski. Si necesita más ayuda solo publique una nueva pregunta, mucha gente está lista para responderla. – rodrigoap

+0

gracias. salvó mi día –

11

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

<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> 
7

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

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

Para <security:http >:
HttpConfigurationBuilder#createFilterSecurityInterceptor() se Regist WebExpressionVoter pero no RoleVoter, AuthenticatedVoter;

Para <security:global-method-security >: GlobalMethodSecurityBeanDefinitionParser#registerAccessManager() se Regist PreInvocationAuthorizationAdviceVoter (condicionalmente), entonces siempre Regist RoleVoter, AuthenticatedVoter, Regist Jsr250Voter condicionalmente;

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

2

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

Cambiar función Prefijo:

<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 donde se desea aplicar el Prefijo de Papel que se puede aplicar a nivel de esquema de seguridad o el nivel de frijol.

<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> 
Cuestiones relacionadas