【发布时间】:2020-08-02 18:15:44
【问题描述】:
我使用 Keycloak 作为我的 OAuth2 授权服务器,并按照GitHub 上的官方示例配置了一个用于多租户的 OAuth2 资源服务器。 考虑到 JWT 令牌的 Issuer 字段来解析当前租户。 因此,令牌会根据在相应 OpenID Connect 众所周知的端点上公开的 JWKS 进行验证。
这是我的安全配置:
@EnableWebSecurity
@RequiredArgsConstructor
@EnableAutoConfiguration(exclude = UserDetailsServiceAutoConfiguration.class)
public class OrganizationSecurityConfiguration extends WebSecurityConfigurerAdapter {
private final TenantService tenantService;
private List<Tenant> tenants;
@PostConstruct
public void init() {
this.tenants = this.tenantService.findAllWithRelationships();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests().anyRequest().authenticated()
.and()
.oauth2ResourceServer()
.authenticationManagerResolver(new MultiTenantAuthenticationManagerResolver(this.tenants));
}
}
这是我的自定义 AuthenticationManagerResolver:
public class MultiTenantAuthenticationManagerResolver implements AuthenticationManagerResolver<HttpServletRequest> {
private final AuthenticationManagerResolver<HttpServletRequest> resolver;
private List<Tenant> tenants;
public MultiTenantAuthenticationManagerResolver(List<Tenant> tenants) {
this.tenants = tenants;
List<String> trustedIssuers = this.tenants.stream()
.map(Tenant::getIssuers)
.flatMap(urls -> urls.stream().map(URL::toString))
.collect(Collectors.toList());
this.resolver = new JwtIssuerAuthenticationManagerResolver(trustedIssuers);
}
@Override
public AuthenticationManager resolve(HttpServletRequest context) {
return this.resolver.resolve(context);
}
}
现在,因为org.springframework.security.oauth2.server.resource.authentication.JwtIssuerAuthenticationManagerResolver.TrustedIssuerJwtAuthenticationManagerResolver的设计
这是private,我想提取自定义主体的唯一方法是重新实现以下所有内容:
- TrustedIssuerJwtAuthenticationManagerResolver
- 返回的AuthenticationManager
- 身份验证转换器
- CustomAuthenticationToken 扩展了 JwtAuthenticationToken
- CustomPrincipal
对我来说,似乎很多重新发明轮子,我唯一需要的是有一个自定义的 Principal。
我发现的示例似乎不适合我的情况,因为它们指的是 OAuth2Client 或者不适用于多租户。
- https://www.baeldung.com/spring-security-oauth-principal-authorities-extractor
- How to extend OAuth2 principal
我真的需要重新实现所有此类/接口,还是有更聪明的方法?
【问题讨论】:
-
你有没有找到关于这件事的任何其他信息?
-
遗憾的是什么都没有
-
嗨,你解决了吗?能否提供更多信息?
标签: spring-boot spring-security spring-security-oauth2