18

我正在尝试使用 JDBC auth 设置 Spring 3 安全性。除了我尝试为拦截 URL 指定多个访问角色之外,一切都运行良好。例如,我希望具有角色 ROLE_USER 和 ROLE_ADMIN 的任何人都能够访问所有页面,我在我的 spring 配置文件中使用以下行 -

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

5 回答 5

46

我有同样的问题,但使用表达式来解决这个问题:

你应该嵌入

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')" />
于 2010-01-20T22:05:53.347 回答
11

我不确定这个问题,实际上我目前在我的项目中使用它并且没有看到问题。尝试删除“,”之后的空格,我的意思是尝试使用 ROLE_USER,ROLE_ADMIN

于 2010-01-20T22:24:10.947 回答
8

我在尝试从 Spring 3.x 迁移到 4.x 时遇到了同样的问题。最后我发现“http”标签的参数“use-expressions”在Spring 4.x中默认变为“true”而不是false(就像在旧版本中一样)。

PS这个问题现在很老了,但我在谷歌上找到了这个。所以其他人也可以找到它,然后这个信息可能会有用。

于 2016-01-22T15:32:08.790 回答
4

我遇到了同样的问题,在这里找到了答案。
使用该行向具有两个角色的用户授予访问权限:
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')" />
如果要向具有所列角色之一的用户授予访问权限,请使用:
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />

此外,您需要在安全 *.xml 中添加使用 SpEL 的功能,添加use-expressions="true"<http>标签。

于 2014-08-21T08:55:37.173 回答
-2

我决定在不更改任何其他内容的情况下降级到 Spring Security 2.0.5,以检查这是否是 3 中的错误,你瞧!

我想我在这里也发现了一个相关的开放错误 - https://jira.springsource.org/browse/SEC-1342

解决方案 - 如果要使用此功能,请使用 2.0.5。

于 2010-01-20T18:04:43.493 回答