2010-01-20 7 views
18

Ich versuche, Spring 3-Sicherheit mit JDBC-Auth einzurichten. Alles funktioniert gut, abgesehen davon, wenn ich versuche, mehrere Zugriffsrollen auf eine Intercept-URL festzulegen. Zum Beispiel möchte ich jemand mit den Rollen ROLE_USER und ROLE_ADMIN der Lage sein, alle Seiten zugreifen zu können, ich die follwoing Linie in meiner Feder-Konfigurationsdatei verwenden -Spring Security 3 geben mehrere Intercept-URL-Zugriffsrollen an

<security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN" /> 

Doch diese führt den folgenden Fehler -

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Unsupported configuration attributes: [ ROLE_ADMIN] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:558) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:852) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:422) 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
    at org.apache.catalina.core.StandardService.start(StandardService.java:516) 
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 
Caused by: java.lang.IllegalArgumentException: Unsupported configuration attributes: [ ROLE_ADMIN] 
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.afterPropertiesSet(AbstractSecurityInterceptor.java:154) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398) 
    ... 27 more 

Wenn angegeben wird, dass nur eine der Rollen auf eine URL zugreifen kann, ist dies in Ordnung (für jede Rolle in Ordnung). Das Ändern der Reihenfolge, in der ich die Rollen festlege, macht auch keinen Unterschied. Es ist so, als ob sich in Spring Security 3 etwas geändert hat, das jetzt nicht mehr mit der Angabe mehrerer Zugriffsrollen umgehen kann.

Ich habe dies erfolgreich früher mit Spring Security 2 funktioniert, und verwende praktisch die gleiche Konfiguration. Irgendwelche Ideen?

ist meine Sicherheitskonfigurationsdatei unten aufgeführt -

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

    <security:http auto-config="true" access-denied-page="/denied.jsp" >  
     <security:form-login 
      default-target-url="/app/home" 
      always-use-default-target="true" /> 

     <security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN" /> 

     <security:logout invalidate-session="true" logout-url="/logout" logout-success-url="" /> 
    </security:http> 

    <security:authentication-manager> 
     <security:authentication-provider> 
      <security:jdbc-user-service data-source-ref="dataSource" 
       users-by-username-query='select "username", "password", "enabled" 
        from users where "username" = ?' 
       authorities-by-username-query='select "username", "authority"      from user_roles where "username" = ?' /> 
     </security:authentication-provider> 
    </security:authentication-manager> 
</beans> 

Antwort

-2

Ich beschloss, Spring Security 2.0.5 herabzustufen ohne zu überprüfen, etwas anderes zu ändern, ob dies ein Fehler in 3 war, und lo-und-siehe, es war!

Ich glaube, ich auch einen Zusammenhang mit offenen Bug hier gefunden - https://jira.springsource.org/browse/SEC-1342

Lösung - 2.0.5 verwenden, wenn Sie diese Funktion verwenden möchten.

45

Ich hatte das gleiche Problem, aber verwendet Ausdrücke, um dieses Problem zu erhalten:

Sie

use-expressions="true" 

in Ihrer bestehenden Konfiguration einbinden sollten. Also:

<security:http auto-config="true" access-denied-page="/denied.jsp" > 

wird

<security:http auto-config="true" access-denied-page="/denied.jsp" use-expressions="true"> 

Und dann:

<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
11

Ich bin über dieses Problem nicht sicher, ich habe es tatsächlich bin derzeit in meinem Projekt und nicht eine sehen Problem. versuchen Sie, den Raum nach dem "," zu entfernen, ich versuche, mit ROLE_USER, ROLE_ADMIN

+3

Teja du hast recht, es können keine Leerzeichen nach dem Komma behandelt werden. Es funktioniert ohne Leerzeichen. – user223695

+0

Die Fehlermeldung macht deutlich, dass dies in der Tat das Problem ist: "Nicht unterstützte Konfigurationsattribute: [ROLE_ADMIN]" –

4

Ich hatte das gleiche Problem und fand die Antwort here.
Verwenden Sie diese Zeile mit beiden Rollen Zugriff auf Benutzer zu gewähren:
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')" />
Wenn Sie mit einem der genannten Rollen, verwenden Zugriff auf Benutzer zu gewähren:
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />

Auch Sie müssen Fähigkeit hinzufügen zu verwenden SPEL in deiner Sicherheit * .xml, füge use-expressions="true" zu <http> hinzu.

7

Ich hatte das gleiche Problem, als ich versuchte, von Spring 3.x zu 4.x zu migrieren. Schließlich fand ich heraus, dass der Parameter "use-expressions" des "http" -Tags standardmäßig in Spring 4.x statt in false (wie in alten Versionen) "true" wurde.

P.S. Diese Frage ist im Moment sehr alt, aber ich habe das in Google gefunden. Es kann also auch jemand anders finden und diese Information könnte dann nützlich sein.