@EnableWebSecurity和#oauth2.clientHasRole-为什么不起作用?

时间:2019-08-02 21:14:43

标签: spring-boot azure-active-directory spring-security-oauth2

一段时间以来,我一直在为此绞尽脑汁。我有一个来自Azure的client_credentials JWT令牌,其有效负载中包含以下内容:

"roles": [ "read", "write" ]

我有一个与此相似的安全配置:

@Configuration
@EnableWebSecurity
public SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests()
            .antMatchers(HttpMethod.GET, "/api", "/api/**").access("#oauth2.clientHasRole(\"read\")")
            .antMatchers(HttpMethod.POST, "/api", "/api/**").access("#oauth2.clientHasRole(\"write\")")
            .anyRequest().access("#oauth2.isClient()");
    }
}

我正在使用:

org.springframework.boot:spring-boot-starter-oauth2-resource-server:2.1.0.RELEASE

我们正在使用一个使用@EnableResourceServer的私有库,但是此后停止使用它,因为它需要内部支持,方法是通过创建自定义代码来连接到Azure –而不是使用看起来可行的@EnableWebSecurity这些特殊权限除外。

那么,#oauth2安全性表达式方法为什么不起作用?我收到以下异常:

java.lang.IllegalArgumentException: Failed to evaluate expression '#oauth2.clientHasRole("read")'

我尝试了@EnableGlobalMethodSecurity(prePostEnabled = true),并通过覆盖OAuth2MethodSecurityExpressionHandler()手动返回了GlobalMethodSecurityConfiguration.createExpressionHandler(),但这没有用。请参阅此this answer作为参考。

作为一种替代方法,我也尝试研究添加一些新的GrantedAuthority,但是如果不亲自验证令牌就无法确定如何做到这一点。我看到使用了SecurityExpressionRoot,但是在检查hasRole()时,它依赖于设置为空的权限。

因此,我很想拥有#oauth.clientHasRole()功能。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我最终遵循了spring document,并通过生成一个bean并引用了它来做出自己的安全性表达式。我不希望以此作为答案,并且希望#oauth2表达式可以直接使用。如果有人有首选的答案,请发布。