Spring oauth2-基于java配置的用户id自定义令牌增强器
我实现了一个RESTfulAPI,并使用SpringSecurityOAuth和资源所有者密码凭据授权。 我希望避免在API中使用会话,所以每次用户调用API时,我都会检查数据库中的令牌 当一个经过身份验证的用户调用API(例如使用URI GET/users)时,我需要从当前用户那里获取用户ID以使用我的业务服务。我的业务服务使用userId而不是userName,并允许我检索当前用户信息或检查是否允许当前用户执行某些操作 目前,我通过JdbcTokenStore存储用户名和令牌。所以每次我都可以使用存储的用户名从数据库中检索userId。但是这个解决方案太重了,它迫使我在使用服务之前为令牌和用户访问数据库两次,这对性能来说太糟糕了 因此,为了解决这个问题,我想用令牌存储userId。使用这个解决方案,当我从数据库中获取令牌时,我拥有当前的用户ID,我可以用这个直接调用服务 问题是我无法成功地将自定义令牌增强器设置为默认令牌服务 下面是我在扩展OAuth2ServerConfigurerAdapter的securityConfig中的实现:Spring oauth2-基于java配置的用户id自定义令牌增强器,java,spring-security,spring-security-oauth2,Java,Spring Security,Spring Security Oauth2,我实现了一个RESTfulAPI,并使用SpringSecurityOAuth和资源所有者密码凭据授权。 我希望避免在API中使用会话,所以每次用户调用API时,我都会检查数据库中的令牌 当一个经过身份验证的用户调用API(例如使用URI GET/users)时,我需要从当前用户那里获取用户ID以使用我的业务服务。我的业务服务使用userId而不是userName,并允许我检索当前用户信息或检查是否允许当前用户执行某些操作 目前,我通过JdbcTokenStore存储用户名和令牌。所以每次我都可
@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
authManagerBuilder
.userDetailsService(new CustomUserDetailsService(userService))
.passwordEncoder(passwordEncoder())
.and()
.apply(new InMemoryClientDetailsServiceConfigurer())
.withClient("ios-app")
.resourceIds(RESOURCE_ID)
.scopes("read", "write")
.authorities("ROLE_USER")
.authorizedGrantTypes("password")
.secret("123456");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.requestMatchers()
.and()
.authorizeRequests()
.antMatchers("users/create").permitAll()
.anyRequest().authenticated()
.and()
.apply(new OAuth2ServerConfigurer())
.tokenStore(new JdbcTokenStore(dataSource))
.resourceId(RESOURCE_ID);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
下面是tokenService的覆盖以添加自定义令牌增强器,但它不起作用:
@Override
public AuthorizationServerTokenServices tokenServices() throws Exception {
DefaultTokenServices tokenService = (DefaultTokenServices)tokenServices();
tokenService.setTokenEnhancer(new CustomTokenEnhancer());
return tokenService;
}
有人有其他想法吗?我也做过类似的事情,但没有使用令牌增强器。我扩展了DefaultTokenServices,将附加信息存储在OAuth2AccessToken对象的additionalInformation映射中。感谢您的回复。实际上,我无法使用我的配置扩展DefaultTokenServices,因为上面的覆盖执行stackoverflowException。使用基于java的配置成功了吗?您使用哪个版本的SpringOAuth2?我刚刚在github上看到了这个链接[我看到一个问题正在得到解决。很抱歉,我没有扩展DefaultTokenServices,但创建了一个新的实现,从中提取代码并根据需要进行修改。我必须相应地更新我的bean声明。我在这里分享了一些更改。不确定如何使用上述配置实现。谢谢,我将尝试实现sim我将在这里发布带有java配置的ilar解决方案。否则,如果它没有更改,我将返回xml配置。您好,NaEs,我是oauth和spring安全的新手,我想与rest api和数据库集成。但是我对配置感到困惑,所以,请建议我从哪里开始oauth和spring安全数据库配置?