oAuth2 Springboot - 在 JDBCTokenStore 添加和返回更多信息
Posted
技术标签:
【中文标题】oAuth2 Springboot - 在 JDBCTokenStore 添加和返回更多信息【英文标题】:oAuth2 Springboot - add and return more informations in JDBCTokenStore 【发布时间】:2021-07-17 16:45:30 【问题描述】:我想知道,是否有办法在 JDBCTokenStore 中添加更多信息。让我解释一下,目前,我正在使用 oauth2 身份验证通过 JDBCTokenStore 保护我的 Spring Boot REST API。
这是我正在使用的 AuthorizationServerConfiguration 类:
@EnableAuthorizationServer
@Configuration
public class AuthorizationServerConfiguration implements AuthorizationServerConfigurer
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private DataSource dataSource;
@Autowired
private AuthenticationManager authenticationManager;
@Bean
TokenStore jdbcTokenStore()
return new JdbcTokenStore(dataSource);
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception
security.checkTokenAccess("isAuthenticated()").tokenKeyAccess("isAuthenticated()");
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception
clients.jdbc(dataSource).passwordEncoder(passwordEncoder);
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception
endpoints.tokenStore(jdbcTokenStore());
endpoints.authenticationManager(authenticationManager);
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter()
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<CorsFilter>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
当我通过 POSTMAN 访问 POST 方法 URL 以获取 OAUTH2 令牌 http://localhost:8082/oauth/token 时,我得到了这个 json 响应:
"access_token": "e71b98dd-8a53-44f4-9673-fa4c1c54a415",
"token_type": "bearer",
"refresh_token": "ac4e82ec-028a-45a6-8801-fe55fcbdd36e",
"expires_in": 3042,
"scope": "READ WRITE"
是否有解决方案可以在我的 Json JDBCTokenStore 中添加有关用户的更多信息(如电子邮件、性别...等)? 显然,TokenEnhancerChain 或 JWT 是我的问题的解决方案,除了我无法在不进行太多修改的情况下将它们集成到我的代码中。
提前谢谢你
【问题讨论】:
【参考方案1】:在我看来,您将 OIDC 用户信息存储到数据库中,就像在您的代码中一样,
@Bean
TokenStore jdbcTokenStore()
return new JdbcTokenStore(dataSource);
您将 dataSource
作为参数传递。因此 Spring 框架将所有 OIDC 用户信息保存到您在此处配置的 dataSource
中。
无论您是使用 JWT 还是会话 ID 来验证和授权请求都无关紧要。关键是您正在使用的OidcUser
。
.getClaims()
在org.springframework.security.oauth2.core.oidc.user Interface OidcUser
OIDC 用户界面中,有一个名为java.util.Map<java.lang.String,java.lang.Object> getClaims()
的方法。这是您调用以获取自定义用户信息的方法,例如"address": "xxx", "totalApiUsage": 123
。
// ...
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication.getPrincipal() instanceof OidcUser)
OidcUser principal = ((OidcUser) authentication.getPrincipal());
// principal.getClaims()
.claim()
发出访问令牌或刷新令牌后,调用.claim("xxx",object)
将自定义键值对放入您的OIDC 用户信息映射中,例如"address": "xxx", "totalApiUsage": 123
。
另见https://developer.okta.com/blog/2017/07/25/oidc-primer-part-1
除了你的问题,你提到了
目前,我正在使用 oauth2 身份验证通过 JDBCTokenStore 保护我的 Spring Boot REST API。
通过使用 Spring 安全框架从其他 OAuth2 授权服务器获取访问令牌,与现有的授权提供程序(如 Facebook、Auth0、Google 等)合作非常好。
但是,如果您想拥有自己的 OAuth2 授权服务器,您应该停止使用 Springboot 授权服务器,因为它目前处于维护模式。 另见EnableAuthorizationServer is working and is not deprecated
【讨论】:
以上是关于oAuth2 Springboot - 在 JDBCTokenStore 添加和返回更多信息的主要内容,如果未能解决你的问题,请参考以下文章
OAuth2用户详细信息未在春季安全(SpringBoot)中更新