web-dev-qa-db-ja.com

URLパターンのSpring Securityでロールを検証できません

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)

同じ上の任意のポインタは非常に高く評価されています。

23
tarunkumar

いくつかのタイプミスがあります。最初の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')" />
43
thedoctor

何が起こるかというと、セキュリティスプリングの公式ドキュメントには、あなたが置いたとおりの例が含まれています。

<Intercept-url pattern = "/ siteadmin / *. Htm" access = "ROLE_ADMIN" />

しかし、あなたは着るべきです

<Intercept-url pattern = ". * Admin.htm" access = "hasRole ('ROLE_ADMIN')" />
6
Rubens