2009-06-12 9 views
28

Während eine Legacy-Anwendung Migration Sicherheit lasse ich die folgende Ausnahme bekam:Wie verwende ich benutzerdefinierte Rollen/Berechtigungen in 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) 

In der alten Anwendung gibt es Rollen wie "Superadmin", "Editor", "Helpdesk" etc. Aber in allen Spring Security Beispiele Ich sehe nur Rollen wie "ROLE_" ("ROLE_ADMIN" usw.). Wenn ich "superadmin" in "ROLE_ADMIN" umbenenne und nur diese Rolle in der Konfiguration verwende, funktioniert alles.

funktioniert nicht:

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

Works:

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

ist möglich, benutzerdefinierte Rollennamen zu benutzen?

+0

Diese [Frage] (http://stackoverflow.com/questions/283870/acegi-security-how-do-i-add - Eine andere - Autorisierte-Authentifizierung-zu-Anonym - kann helfen. – kgiannakakis

Antwort

39

Sie verwenden die Standardkonfiguration, die erwartet, dass Rollen mit dem Präfix "ROLE_" beginnen. Sie müssen eine benutzerdefinierte Sicherheitskonfiguration hinzufügen und rolePrefix auf "" setzen;

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

+0

Kann ich einen ROLE_FOO oder einen ROLE_BAR oder einen ROLE_ANYTHING_I_WANT haben? Der Link, den du angegeben hast, ist nicht auf das Problem ausgerichtet, es ist nur ein Typ, der sagt: "RolePrefix für RoleVoter kann nicht gesetzt werden" –

+6

Ja, du kannst jede beliebige Rolle haben. Der Link zeigt ein Konfigurationsbeispiel und kann Ihnen vielleicht nicht helfen, aber es war für D. Wroblewski nützlich. Wenn Sie mehr Hilfe brauchen, schreiben Sie einfach eine neue Frage, viele Leute sind bereit, sie zu beantworten. – rodrigoap

+0

danke. rettete meinen Tag –

11

ist die komplette Konfiguration Zugriff Ausdrücken (Link von @rodrigoap vorgesehen scheint ein wenig veraltet):

<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

Sie können auch immer Ausdruck verwenden (durch Konfig use-expressions="true"), um ROLE_ Präfix zu ignorieren.

Nach Spring Security 3.1 Quellcode zu lesen, fand ich, wenn use-expressions="true":

Für <security:http >:
HttpConfigurationBuilder#createFilterSecurityInterceptor()WebExpressionVoter erfolgte Anmeldung wird aber nicht RoleVoter, AuthenticatedVoter;

Für <security:global-method-security >: GlobalMethodSecurityBeanDefinitionParser#registerAccessManager() wird erfolgter Anmeldung PreInvocationAuthorizationAdviceVoter (bedingt), dann immer per Einschreiben RoleVoter, AuthenticatedVoter, Ausrichteinleitungspfad Jsr250Voter bedingt;

PreInvocationAuthorizationAdviceVoter verarbeitet PreInvocationAttribute (PreInvocationExpressionAttribute wird als Implementierung verwendet), die nach @PreAuthorize generiert wird. PreInvocationExpressionAttribute#getAttribute() immer null zurückgeben, also RoleVoter, AuthenticatedVoter nicht abstimmen.

2

Verwenden von Spring Security 3.2, das funktionierte für mich.

Rolle ändern Prefix:

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

Je nachdem, wo Sie die Rolle Präfix anwenden möchte, kann es auf der Security Schemaebene oder Bohnen Ebene angewendet werden.

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

Nehmen Role Präfix an Service Level:

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