spring-security - 如何在作为 OAuth2 资源服务器运行的 Spring WebFlux 应用程序中编辑 Principal 的角色和名称信息?
问题描述
我正在开发一个应用程序,其中我的后端是无状态资源服务器。它收到的每个请求都应该包含一个Authentication
带有 JWT Bearer 令牌的标头 - 目前是 Google id_token
。我能够验证令牌,但为了实现方法级别的安全性,我需要能够使用来自存储库/服务的信息来设置主体的角色和名称。如何设置委托人的角色和姓名?
在 Spring 教程之后,我试图定义一个UserDetailsService
bean 来设置信息,但它似乎没有被调用。我在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 角色的用户来访问它。
解决方案
推荐阅读
- regex - Bash 正则表达式似乎在简单匹配上失败了?
- heroku - Heroku 错误:无效要求:'_libgcc_mutex=0.1=conda_forge'
- math - 缩放旋转椭圆的 X 轴
- visual-studio - 无法使用 Visual Studio Live Share 在客户端启动项目窗口
- python-2.7 - pip install mock 有效,但 import mock 无效
- javascript - 如何通过 esri js 中的 javascript api 访问安全的 webscene(无需向用户询问凭据。)
- python - 当我在 python tkinter 中另存为 pdf 时,它显示错误
- docker - 在构建 VSCode 开发容器时使用主机网络
- powershell - 混合纠缠发现和运行变量
- asp.net-core - 为什么我的 URL 在我按 Enter 之前得到处理?