当前位置: 首页 > 知识库问答 >
问题:

spring-security-oauth2 JWKTokeStore和自定义用户详细信息服务

仲孙鸣
2023-03-14

我有一个富网络(基于反应)前端应用程序,它将请求发送到后端资源服务器应用程序。请求在头中与JWT一起发送以进行身份验证。我的设置对Okta授权服务器进行身份验证,并从单独的服务中检索组/授权。

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

@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");
    }

有了这个设置,我可以使用JwkTokenStore实现来验证JWT令牌(它在内部使用JwkVerifyingJwtAccessTokenConver来验证Json Web Keyset的密钥uri)。但是我无法将其配置为

  1. 拉出特定的JWT声明,为其创建身份验证。它只看用户名声明,我想在上面使用电子邮件或其他声明

Spring-security-oauth2的JWK相关实现似乎已经关闭,大多数与JWK验证相关的类都没有公开。利用jwktokestore提供的令牌验证,并能够在其中包含您自己的用户详细信息以加载权限的好方法是什么。

正在使用的软件版本:Springboot 1.5.2。版本,spring security core:4.2.3,spring-security-oauth2:2.0.14,

共有1个答案

那宏大
2023-03-14

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

您可以@AutowireCustomAccessTokenConverter导入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;
    }
}

之后,您应该能够通过OAuth2Auth验证对象访问声明。

 类似资料:
  • 我对Java和Spring3(过去8年主要使用PHP)还很陌生。我已经使用spring security 3来处理所有默认的userDetails和userDetailsService,我知道我可以通过使用以下命令访问控制器中登录用户的用户名: 但有两个问题我想不通: > 我希望在用户登录时存储许多其他用户详细信息(如DOB、性别等),并在以后通过控制器进行访问。我需要做什么才能使创建的userD

  • 问题内容: 我正在尝试使用数据库表在Spring应用程序中应用安全性。 到目前为止,我的applicationContext-Security中有: 我对userDetailsS​​ervice的实现如下所示: 我的汇编程序如下所示: 现在,用户实体为: 我的userentitydao界面是: 实现是: 现在,当我尝试在tomcat上进行部署时,出现以下异常: 而不管我该怎么办,我不知道这是怎么回

  • 我正在使用spring security 3.2、JSF2和Hibernate4。 我已经完成了3/4的工作:)但是我的身份验证系统还不起作用。 我有一个实现UserDetailsService的UserService,一个实现UserDetails的域类用户。 登录系统从不阻止用户访问安全页面,我尝试了数据库中不存在的用户名和密码... 谢谢你的帮助。 我有一个loginBean,当用户通过登录

  • 同时尝试Spring启动、安全性和数据。 我刚刚遇到了这种情况: 我在内存数据库中使用H2,并在启动时用liquibase和一个用户用用户名和密码对其进行加密。 现在我想让Spring Security性根据H2进行身份验证。为此,我有以下代码: 并且我实现了如下userDetails: 但我的测试一直失败 身份验证不应为空 尝试登录会给我 凭据错误 要使UserDetailsService的自定

  • 我有一个Keycloak连接器,它允许我通过SSO检索用户的用户名。我想使用这个用户名来认证用户,并在数据库中查找他的权限,并将这个用户权限注入到spring security中,以便能够使用它的功能。 我用自定义的UserDetailsService创建了一个自定义的authenticationProvider,但我一直面临的问题是,我每次都被重定向到spring security登录页面。我认

  • 我登录到www.someurl.com/admin下的一个页面。然后我在同一个窗口选项卡中将url更改为www.someurl.com。我在同一个http会话中工作,所以我希望能够检索用户登录详细信息。 {spring_security_context=org.springframework.security.core.context.securitycontextimpl@ed20eaf7:Au