无法在 Spring Security 中验证 url 模式的角色

Posted

技术标签:

【中文标题】无法在 Spring Security 中验证 url 模式的角色【英文标题】:Unable to validate role in Spring Security for url pattern 【发布时间】: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)

高度赞赏任何指针。

【问题讨论】:

【参考方案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 文档会出错?

以上是关于无法在 Spring Security 中验证 url 模式的角色的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:无法在前端进行身份验证

无法在 Spring Security 中识别身份验证提供者 user-service-ref

Spring Security SAML - 无法验证签名

无法使用 Angular 和 Spring Security 设置身份验证标头

Grails Spring-Security-Core 插件 - 无法验证用户

无法为 Spring Security 提供自定义身份验证提供程序