Spring Security 3.1.7.RELEASEとSpring 3.2.13.RELEASEを使用しています。
次のように、spring-security.xmlにエントリがあります。
<http auto-config="true" use-expressions="true">
<intercept-url pattern=".*admin.htm" access="hasRole(ROLE_ADMIN)" />
<intercept-url pattern="/siteadmin/*.htm" access="ROLE_ADMIN" />
<intercept-url pattern="/siteadmin/cleancache.htm" access="hasRole('ROLE_ADMIN')" />
Url /siteadmin/cleancache.htmにアクセスしようとすると、次の例外が発生します。
Java.lang.IllegalArgumentException:式 'ROLE_ADMIN'の評価に失敗しましたorg.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.Java:13)org.springframework.security.web.access.expression.WebExpressionVoter.vote(WebExpressionVoter .Java:34)org.springframework.security.web.access.expression.WebExpressionVoter.vote(WebExpressionVoter.Java:18)org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.Java:62)
根本的な原因:
org.springframework.expression.spel.SpelEvaluationException:EL1008E:(pos 0):プロパティまたはフィールド「ROLE_ADMIN」がタイプ「org.springframework.security.web.access.expression.WebSecurityExpressionRoot」のオブジェクトに見つかりませんか? org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.Java:214)org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.Java:85)org.springframework.expression.spel.ast。 PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.Java:78)org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.Java:102)org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.Java:98) org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.Java:11)org.springframework.security.web.access.expression.WebExpressionVoter.vote(WebExpressionVoter.Java:34)
同じ上の任意のポインタは非常に高く評価されています。
いくつかのタイプミスがあります。最初のintercept-url行にはROLE_ADMINを囲む単一引用符が欠落しており、2番目の行にはhasRoleが欠落しています。そのはず
<http auto-config="true" use-expressions="true">
<intercept-url pattern=".*admin.htm" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/siteadmin/*.htm" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/siteadmin/cleancache.htm" access="hasRole('ROLE_ADMIN')" />
何が起こるかというと、セキュリティスプリングの公式ドキュメントには、あなたが置いたとおりの例が含まれています。
<Intercept-url pattern = "/ siteadmin / *. Htm" access = "ROLE_ADMIN" />
しかし、あなたは着るべきです
<Intercept-url pattern = ". * Admin.htm" access = "hasRole ('ROLE_ADMIN')" />