gpt4 book ai didi

authentication - spring-security-oauth2 JwkTokenStore 与自定义用户详细信息服务

转载 作者:行者123 更新时间:2023-12-04 08:26:24 25 4
gpt4 key购买 nike

我有一个富 Web(基于 react 的)前端应用程序,它将请求发送到后端 ResourceServer 应用程序。请求在 header 中使用 JWT 发送以进行身份​​验证。我的设置对 Okta 授权服务器进行身份验证,并从单独的服务中检索组/权限。

我将后端服务器设置为带有 Spring Security Oauth2 资源服务器的 Springboot 应用程序 @EnableResourceServer

@Configuration
@EnableResourceServer
public class SecurityConfig extends ResourceServerConfigurerAdapter {

@Override
public void configure(HttpSecurity http) throws Exception{
http.requestMatchers().antMatchers("/api/**")
.and()
.authorizeRequests().anyRequest().authenticated();
}

@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenServices(tokenServices()).resourceId("my-okta-resource-server-client-id");
}

@Bean
@Primary
public DefaultTokenServices tokenServices() throws Exception {
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setTokenStore(tokenStore());
return tokenServices;
}

@Bean
public TokenStore tokenStore() throws Exception {
return new JwkTokenStore("https://my-org.oktapreview.com/oauth2/my-auth-server/v1/keys");
}

通过此设置,我可以验证 JWT token 可以使用 JwkTokenStore实现(它在内部使用 JwkVerifyingJwtAccessTokenConverter 从提供的 key uri 中验证 Json Web key 集)。但是我无法将其配置为
  • 为它提取特定的 JWT 声明以创建 Authentication .它只查看 user_name 声明,我想在那里使用电子邮件或其他声明。
  • 注入(inject)自定义用户详细信息服务。 DefaultUserAuthenticationConverter它封装了 UserDetailsService深深嵌入其中。这我需要在单独的休息服务中查找用户设置的权限。

  • Spring-security-oauth2 的 JWK 相关实现似乎与 JWKs 的大部分内容都关闭了。验证相关的类不公开。
    使用 JwkTokenStore 提供的 token 验证的好方法是什么?并且还可以在其中拥有您自己的用户详细信息以加载权限。

    使用的软件版本:
    Springboot 1.5.2.RELEASE,spring-security-core:4.2.3,spring-security-oauth2:2.0.14,

    最佳答案

    您应该使用所谓的 DefaultAccessTokenConverter提取这些额外的声明并将其添加到 OAuth2Authentication目的。

    您可以@Autowire CustomAccessTokenConverter进入您的ResourceServerConfiguration类,然后将其设置为您的 JwtTokenStore()配置。

    资源服务器配置:

    @Autowired
    private CustomAccessTokenConverter yourCustomAccessTokenConverter;

    @Override
    public void configure(final ResourceServerSecurityConfigurer config) {
    config.tokenServices(tokenServices()).resourceId(resourceId);
    }

    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
    final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
    defaultTokenServices.setTokenStore(jwkTokenStore());
    return defaultTokenServices;
    }

    @Bean
    public TokenStore jwtTokenStore() throws Exception {
    return new JwkTokenStore("https://my-org.oktapreview.com/oauth2/my-auth-server/v1/keys", accessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setAccessTokenConverter(yourCustomAccessTokenConverter);
    return converter;
    }

    可以配置 CustomAccessTokenConverter,以便在此处提取自定义声明。

    CustomAccessTokenConverter:
    @Component
    public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {

    @Override
    public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
    OAuth2Authentication authentication = super.extractAuthentication(claims);
    authentication.setDetails(claims);
    return authentication;
    }
    }

    之后,您应该能够通过 OAuth2Authentication 访问 claim 。目的。

    关于authentication - spring-security-oauth2 JwkTokenStore 与自定义用户详细信息服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44958815/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com