首页 > 解决方案 > 如何在作为 OAuth2 资源服务器运行的 Spring WebFlux 应用程序中编辑 Principal 的角色和名称信息?

问题描述

我正在开发一个应用程序,其中我的后端是无状态资源服务器。它收到的每个请求都应该包含一个Authentication带有 JWT Bearer 令牌的标头 - 目前是 Google id_token。我能够验证令牌,但为了实现方法级别的安全性,我需要能够使用来自存储库/服务的信息来设置主体的角色和名称。如何设置委托人的角色和姓名?

在 Spring 教程之后,我试图定义一个UserDetailsServicebean 来设置信息,但它似乎没有被调用。我在findByUsername方法中添加了一个断点,但执行永远不会停在那里。

应用程序.yml 文件

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://accounts.google.com

配置.java文件:

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfig {

    @Bean
    SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) throws Exception {
        http
                .authorizeExchange()
                .pathMatchers("/**")
                .authenticated()
        .and()
                .oauth2ResourceServer()
                .jwt();
        return http.build();
    }

    // Using MapReactiveUserDetailsService, but I'll create my custom UserDetailsService implementation
    @Bean
    public MapReactiveUserDetailsService userDetailsService() {
        User.UserBuilder userBuilder = User.withDefaultPasswordEncoder();
        UserDetails rob = userBuilder.username("rob") //Instead of 'rob' and 'admin' I have in my code the Google ID of the Google accounts that I'm using to create the token
                .password("rob")
                .roles("USER")
                .build();
        UserDetails admin = userBuilder.username("admin") 
                .password("admin")
                .roles("USER","ADMIN")
                .build();
        return new MapReactiveUserDetailsService(rob, admin);
    }

SecuredController.java文件:

@RestController
public class SecuredController {
    @GetMapping("/secured")
    @PreAuthorize("hasRole('ADMIN')")
    public Mono<Principal> secured(Principal principal) {
        return Mono.just(principal);
    }
}

使用此配置,不会调用用户详细信息服务,并且我无法到达GET /secured端点。我想使用具有 ADMIN 角色的用户来访问它。

标签: spring-securityspring-security-oauth2spring-webflux

解决方案


推荐阅读