一段时间以来,我一直在为此绞尽脑汁。我有一个来自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()
功能。任何帮助将不胜感激!
答案 0 :(得分:0)
我最终遵循了spring document,并通过生成一个bean并引用了它来做出自己的安全性表达式。我不希望以此作为答案,并且希望#oauth2
表达式可以直接使用。如果有人有首选的答案,请发布。