我看了几乎所有关于这个主题的博客和帖子,但没有找到解决办法。我有一个 WebSecurityConfigurerAdapter
看起来是这样的:
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
String issuerUri = "issuer url";
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().disable()
.authorizeRequests(authorizeRequests ->
authorizeRequests
.antMatchers(HttpMethod.GET, "/test").hasRole("Task.Write")
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2ResourceServer ->
oauth2ResourceServer
.jwt(jwt ->
jwt.decoder(JwtDecoders.fromIssuerLocation(issuerUri))
)
);
}
我有一个控制器,看起来像这样:
@GetMapping(value="/test")
public ApplicationResponse test(@AuthenticationPrincipal Jwt jwt) {
// Map<String, Object> x = jwt.getClaims();
return new ApplicationResponse("ok", "ok");
}
然而,当我用一个有效的jwt用postman击中这个端点时,我得到了一个403错误。我试过给这个角色加上前缀 ROLE_
以及 Role_
尝试了很多其他的事情,但总是403。
奇怪的是如果我 permitAll()
而不是验证并让jwt通过。我可以查看控制器中的jwt对象。我看到角色就在那里。为什么会这样 WebSecurityConfigurerAdapter
当jwt有效并且角色在那里时总是抛出403?
我注意到角色位于jwt中的声明中。也许我需要从这里得到它?我看不到如何从configure方法中的声明中获取角色:
暂无答案!
目前还没有任何答案,快来回答吧!