Spring Security 3 указывает несколько ролей доступа для перехвата URL - PullRequest
18 голосов
/ 20 января 2010

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

<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, и теперь он не может обрабатывать указанные роли множественного доступа.

Ранее я успешно работал с 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>

Ответы [ 5 ]

46 голосов
/ 21 января 2010

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

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

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 голосов
/ 21 января 2010

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

7 голосов
/ 22 января 2016

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

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

4 голосов
/ 21 августа 2014

У меня была такая же проблема, и я нашел ответ здесь .
Используйте эту строку для предоставления доступа пользователю с обеими ролями:
<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>.

0 голосов
/ 20 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...