如何在作为OAuth2资源服务器运行的Spring WebFlux应用程序中编辑委托人的角色和名称信息?

时间:2019-04-07 16:43:03

标签: spring-security spring-security-oauth2 spring-webflux

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

在Spring教程之后,我试图定义一个UserDetailsService bean来设置信息,但是似乎并未调用它。我在findByUsername方法中添加了一个断点,但是执行从未停止过。

application.yml 文件

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

Config.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角色的用户来实现。

0 个答案:

没有答案