我正在开发一个后端为无状态资源服务器的应用程序。它收到的每个请求都应包含一个带有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角色的用户来实现。