Spring boot Spring security可以';t从JWT中提取角色
我在Oauth服务器上使用FusionAuth,我遇到了一个问题。Spring security将成功解码JWT,但没有角色 这是我在JSON中的完整身份验证对象: 正如你所看到的,我的主体中有角色和角色对象。但是当我尝试在@preauthroye中使用它时,甚至记录它。它是空的 Web安全配置适配器:Spring boot Spring security可以';t从JWT中提取角色,spring-boot,spring-security,jwt,spring-security-oauth2,Spring Boot,Spring Security,Jwt,Spring Security Oauth2,我在Oauth服务器上使用FusionAuth,我遇到了一个问题。Spring security将成功解码JWT,但没有角色 这是我在JSON中的完整身份验证对象: 正如你所看到的,我的主体中有角色和角色对象。但是当我尝试在@preauthroye中使用它时,甚至记录它。它是空的 Web安全配置适配器: @Override protected void configure(HttpSecurity http) throws Exception { http.csrf()
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests(authorizeRequests ->
authorizeRequests
.antMatchers(HttpMethod.GET, "v1/balance/**").permitAll()
.antMatchers(HttpMethod.POST, "v1/balance/**").permitAll()
.antMatchers(HttpMethod.GET, "/actuator/**").permitAll()
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2ResourceServer ->
oauth2ResourceServer
.jwt(jwt ->
jwt.decoder(JwtDecoders.fromIssuerLocation(issuerUri)).jwkSetUri(jwksUrl)
)
);
}
以下是我尝试记录角色的方式:
@GetMapping("/currency/{currency}")
// @PreAuthorize("hasAnyRole('admin')")
public CurrencyBalance getWalletByCurrency(@PathVariable String currency, Principal principal){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Set<String> roles = authentication.getAuthorities().stream()
.map(r -> r.getAuthority()).collect(Collectors.toSet());
System.out.println(roles);
System.out.println(new Gson().toJson(authentication));
System.out.println(authentication.getAuthorities());
System.out.println(authentication.getCredentials().toString());
System.out.println(authentication.getDetails());
System.out.println(authentication.getPrincipal());
System.out.println(authentication.getName());
return null;
// return balanceService.getWalletByCurrency(principal.getName(),currency);
}
@GetMapping(“/currency/{currency}”)
//@PreAuthorize(“hasAnyRole('admin')”)
公共货币余额getWalletByCurrency(@PathVariable String currency,Principal){
身份验证=SecurityContextHolder.getContext().getAuthentication();
Set roles=authentication.getAuthorities().stream()
.map(r->r.getAuthority()).collect(collector.toSet());
System.out.println(角色);
System.out.println(新的Gson().toJson(身份验证));
System.out.println(authentication.getAuthorities());
System.out.println(authentication.getCredentials().toString());
System.out.println(authentication.getDetails());
System.out.println(authentication.getPrincipal());
System.out.println(authentication.getName());
返回null;
//返回balanceService.getWalletByCurrency(principal.getName(),currency);
}
首先,您需要了解JWT身份验证是如何工作的
将JWT转换为身份验证的授权,默认情况下,它仅将JWT的范围解码为授权
如果要解码JWT的自定义属性,必须创建JwtAuthenticationConverter的子类并重写ExtractAuthories方法。
最后,将您的自定义子类声明为Bean,spring security将自动使用它。首先,您需要了解JWT身份验证是如何工作的 将JWT转换为身份验证的授权,默认情况下,它仅将JWT的范围解码为授权 如果要解码JWT的自定义属性,必须创建JwtAuthenticationConverter的子类并重写ExtractAuthories方法。 最后,将自定义子类声明为Bean,spring安全性将自动使用它