【问题标题】:Unable to validate role in Spring Security for url pattern无法在 Spring Security 中验证 url 模式的角色
【发布时间】:2015-04-12 02:59:42
【问题描述】:

我正在使用 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)

高度赞赏任何指针。

【问题讨论】:

    标签: spring spring-mvc spring-security spelevaluationexception


    【解决方案1】:

    你有几个错别字。第一个 intercept-url 行缺少 ROLE_ADMIN 周围的单引号,第二行缺少 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')" />
    

    【讨论】:

    • 商定的原因是以前我没有使用任何工作正常的表达式。因此,我想先用几个 URL 测试这个方法,而不是一次更改整个 xml,这就是我面临这个问题的地方
    • 没有问题,我过去做过类似的事情。
    • tarunkumar 同样的问题,对我来说同样的解决方案
    【解决方案2】:

    发生的事情是security spring的官方文档带来了您放置的示例:

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

    但你应该穿

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

    【讨论】:

    • @Karthikeyan Vaithilingam 为什么这里的 spring 文档会出错?
    • @JasonKrs 我不是发布这个答案的人,我只是编辑了它。
    • @Rubens 我有同样的问题,但你的回答没有解决。为什么这里的 spring 文档会出错?
    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多