我有这些服务
- 使用JDBC提供程序(DB-1)的oauth2身份验证服务器
- 启用zuul的web应用程序,将请求代理到authserver和资源服务器
- 启用@EnableOauth2Resource (DB-2)的资源
我需要使用从DB-1收到的凭据从DB-2获取资源服务器中的用户详细信息,并将启用的权限设置为当前主体,以便与@ preauthorization的@RolesAllowed注释进一步使用。
是否有一些钩子来替换或更新org.springframework.security.oauth2.provider。使用oauth2令牌验证成功后进行OAuth2Authentication ?
我通过配置我的资源服务器获得了资源服务器上的主体。
@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响应,这表明令牌无效。
如果使用Spring Boot和您的用户详细信息可以通过标准方式获取,请首先查看Spring Boot文档中有关自定义用户信息的内容。
如果你需要进一步的控制,我建议提供一个resourceserverconfigiler来提供一个自定义的ResourceServerTokenServices,它可以用你需要的主体细节填充你的OAuth2Authentication。
ResourceServerTokenServices由OAuth2AuthenticationManager或OAuth2ClientAuthenticationProcessingFilter传递一个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
}