【问题标题】:Failed to evaluate expression '#oauth2.throwOnError(#oauth2.hasRole('USER'))无法评估表达式'#oauth2.throwOnError(#oauth2.hasRole('USER'))
【发布时间】:2017-06-21 10:37:29
【问题描述】:

我用 spring-boot 和 oauth 开始了一个新项目。我尝试保护我的项目的一些 url。

这里是我的 Httpsecurty 配置:

http.authorizeRequests()
                .antMatchers("/test")
                .access("#oauth2.hasRole('USER')")

我的 clientdetailsserviceconfigurer 也有这个配置:

    clients.inMemory()
        .withClient("xxxxx")
        .authorizedGrantTypes("password", "refresh_token")
        .authorities("USER")
        .scopes("read")
        .resourceIds(RESOURCE_ID)
        .secret("sssss")

我注册了一个角色为“USER”的用户,我从服务器收到了一个 access_token。但是当我尝试使用这个令牌访问 /test/ url 时,我得到了这个 execption

java.lang.IllegalArgumentException: Failed to evaluate expression '#oauth2.throwOnError(#oauth2.hasRole('USER'))'
    at org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:13)
    at org.springframework.security.web.access.expression.WebExpressionVoter.vote(WebExpressionVoter.java:34)
    at org.springframework.security.web.access.expression.WebExpressionVoter.vote(WebExpressionVoter.java:18)
    at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:62)
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:206)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:176)

当我尝试不带 #oauth2 参数时:

.access("hasRole('USER')")

,我明白了:

type=AUTHORIZATION_FAILURE, data={type=org.springframework.security.access.AccessDeniedException, message=Access is denied}]

有人有什么想法吗? 谢谢 干杯

【问题讨论】:

    标签: java spring spring-security oauth-2.0 spring-security-oauth2


    【解决方案1】:

    我知道这个问题很老了,但幸运的是解决方案.access("hasRole('USER')") 帮助了我。谢谢你的帮助。

    但是对于其他人(学习弹簧安全),让我分享我对这个问题的了解,您尝试登录的用户似乎无权访问该角色,因此请检查您的数据库 (USER_ROLE) 如果该用户具有关联的角色。因为在我的场景中,我正在检查管理员角色,当我尝试使用非管理员用户登录时,出现了相同的错误 'Access Denied'。

    【讨论】:

      【解决方案2】:

      尝试将WebExpressionVoter 的expressionHandler 设置为OAuth2WebSecurityExpressionHandler 的实例:

      webExpressionVoter.setExpressionHandler(new OAuth2WebSecurityExpressionHandler());
      

      您也可以尝试使用.hasRole( "USER" ) 代替您的.access(...)。

      【讨论】:

        猜你喜欢
        • 2020-06-26
        • 2015-01-17
        • 1970-01-01
        • 2017-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        相关资源
        最近更新 更多