【问题标题】:How to attach UserDetails to Principal received from JWT token using Spring Oauth2如何使用 Spring Oauth2 将 UserDetails 附加到从 JWT 令牌收到的 Principal
【发布时间】:2016-01-06 08:10:21
【问题描述】:
我有这些服务
- 使用 JDBC 提供程序 (DB-1) 的 oauth2 身份验证服务器
- 启用 Zuul 的 Web 应用程序代理对 authserver 和资源服务器的请求
- 启用@EnableOauth2Resource (DB-2) 的资源
我需要使用从 DB-1 接收的凭据从 DB-2 获取资源服务器中的用户详细信息,并将启用的权限设置为当前 Principal,以便进一步使用 @RolesAllowed 注释的 @PreAuthorize。
在使用 oauth2 令牌成功进行身份验证后,是否有一些挂钩可以替换或更新 org.springframework.security.oauth2.provider.OAuth2Authentication?
【问题讨论】:
标签:
java
spring
oauth
spring-security-oauth2
【解决方案1】:
我通过将我的资源服务器配置为..来获得资源服务器的主体。
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
public ResourceServerConfiguration() {
super();
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated();
}
/* returns org.springframework.security.core.userdetails.UserDetailsService */
@Bean
UserDetailsService customUserDetailsService () {
return new CustomUserDetailsService();
}
@Bean
public UserAuthenticationConverter userAuthenticationConverter () {
DefaultUserAuthenticationConverter defaultUAC = new DefaultUserAuthenticationConverter();
defaultUAC.setUserDetailsService(customUserDetailsService());
return defaultUAC;
}
@Bean
public AccessTokenConverter accessTokenConverter() {
DefaultAccessTokenConverter defaultATC = new DefaultAccessTokenConverter();
defaultATC.setUserTokenConverter(userAuthenticationConverter());
return defaultATC;
}
@Bean
RemoteTokenServices getRemoteTokenServices () {
RemoteTokenServices rts = new RemoteTokenServices();
rts.setCheckTokenEndpointUrl("http://localhost:9999/uaa/oauth/check_token");
rts.setAccessTokenConverter(accessTokenConverter());
rts.setClientId("yourClientID");
rts.setClientSecret("yourClientSecret");
return rts;
}
...
}
基本上在这里,我们通过从 accesstoken 获取身份验证信息,使用 customUserDetailsService 更新资源服务器上的身份验证主体。 RemoteTokenServices 查询 auth-server 的 /check_token 端点以获取访问令牌的内容。如果端点返回 400 响应,则表明令牌无效。
【解决方案2】:
如果使用 Spring Boot 并且可以通过标准方式获取您的用户详细信息,请首先查看 customizing user information 上的 Spring Boot 文档。
如果您需要进一步控制,我建议提供 ResourceServerConfigurer 来提供自定义 ResourceServerTokenServices,它可以使用您需要的主体详细信息填充您的 OAuth2Authentication。
OAuth2AuthenticationManager 或 OAuth2ClientAuthenticationProcessingFilter 向 ResourceServerTokenServices 传递了一个 accessToken,并期望得到一个填充的 OAuth2Authentication 作为回报。这使您有机会获取主体信息并将其填充到 OAuth2Authentication 对象中。
同样,如果使用 Spring Boot,ResourceServerConfigurer,如果实例化为 bean,将被 OAuth2 自动配置拾取,并且您的 ResourceServerTokenServices 将被注册。
@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Autowired
private MyResourceServerTokenServices tokenServices;
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenServices(tokenServices);
}
}
覆盖
@Override
public OAuth2Authentication loadAuthentication(String accessToken) {
// fetch user information and return populated authentication
}