JDBC認証を使用してSpring 3のセキュリティを設定しようとしています。 intercept-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
1つのロールのみが任意の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>
私は同じ問題を抱えていましたが、この問題を回避するために式を使用しました:
埋め込む必要があります
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')" />
この問題についてはよくわかりませんが、実際には現在プロジェクトで使用しており、問題は発生していません。 「、」の後のスペースを削除してみてください。つまり、ROLE_USER、ROLE_ADMINを使用してみてください
Spring 3.xから4.xに移行しようとしたときにも同じ問題が発生しました。最後に、Spring 4.xでは、「http」タグのパラメーター「use-expressions」がデフォルトで「true」になることがわかりました(以前のバージョンのように)。
追伸この質問は今のところ非常に古いですが、Googleでこれを見つけました。他の誰かもそれを見つけることができるので、この情報は役に立つかもしれません。
私は同じ問題を抱えており、答えを見つけました here 。
その行を使用して、両方の役割を持つユーザーにアクセスを許可します。<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>
タグに追加します。