Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring security可以';t从JWT中提取角色_Spring Boot_Spring Security_Jwt_Spring Security Oauth2 - Fatal编程技术网

Spring boot Spring security可以';t从JWT中提取角色

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()

我在Oauth服务器上使用FusionAuth,我遇到了一个问题。Spring security将成功解码JWT,但没有角色

这是我在JSON中的完整身份验证对象:

正如你所看到的,我的主体中有角色和角色对象。但是当我尝试在@preauthroye中使用它时,甚至记录它。它是空的

Web安全配置适配器:

@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安全性将自动使用它