2010-01-20 3 views
18

Я пытаюсь настроить Spring 3 безопасности с использованием JDBC-аутентификации. Все отлично работает, когда я пытаюсь указать несколько ролей доступа для перехвата-url. Например, я хочу, чтобы кто с ролями ROLE_USER и ROLE_ADMIN, чтобы иметь возможность получить доступ ко всем страницам, я использую происходит некорректно строку в моем весеннем конфигурационный файл -Spring Security 3 указывает несколько ролей доступа к перехвату-url

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

Однако это проливает следующее сообщение об ошибке -

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 

Если указать, что только одна из ролей может получить доступ к любому URL-адресу, тогда это нормально (отлично подходит для любой роли). Изменение порядка, в котором я определяю роли, также не имеет значения. Как будто что-то изменилось в Spring Security 3, которое теперь не может обрабатывать заданные роли роли mulitple.

Я успешно получил эту работу ранее с Spring Security 2 и использую практически ту же конфигурацию. Есть идеи?

Мой конфигурационный файл безопасности приведена ниже -

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

ответ

-2

я решил вернуться к использованию Spring Security 2.0.5, не меняя ничего другого, чтобы проверить, было ли это ошибкой в ​​3, и вот-вот и-ее был!

Я думаю, что я нашел родственную открытый ошибка здесь - https://jira.springsource.org/browse/SEC-1342

решение - использовать 2.0.5, если хотите использовать эту функцию.

45

Я была такая же проблема, но использовал выражение, чтобы обойти эту проблему:

Вы должны вставлять

use-expressions="true" 

в существующей конфигурации. Итак:

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

становится

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

И затем:

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

Я не уверен, что об этой проблеме, на самом деле я использую его в настоящее время в моем проекте и не вижу вопрос. попробуйте удалить пробел после "," Я имею в виду попробовать использовать ROLE_USER, ROLE_ADMIN

+3

Teja, вы правы, он не может обрабатывать пробелы после запятой. Он отлично работает без пробелов. – user223695

+0

Сообщение об ошибке дает понять, что это действительно проблема: "Неподдерживаемые атрибуты конфигурации: [ROLE_ADMIN]" –

4

У меня была такая же проблема и я нашел ответа here.
Используйте эту линию для предоставления доступа к пользователю с обеими ролями:
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')" />
Если вы хотите предоставить доступ к пользователю с одной из перечисленных ролей, используйте:
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />

Кроме того, вам нужно добавить возможность использовать SpEL в вашей безопасности * .xml, добавьте use-expressions="true" в <http> тег.

7

У меня была такая же проблема, когда пыталась перейти с Spring 3.x на 4.x. Наконец, я обнаружил, что параметр «использование-выражения» тега «http» по умолчанию стал «истинным» в Spring 4.x вместо false (как это было в старых версиях).

P.S. На данный момент этот вопрос очень старый, но я нашел это в Google. Поэтому кто-то еще может его найти, и тогда эта информация может быть полезна.

Смежные вопросы