【发布时间】:2018-12-16 19:43:33
【问题描述】:
从 OAuth 授权服务器发送一些额外的信息,这些信息需要在资源服务器上的自定义 UserDetails 类中,最好是在 SpringSecurity Principal 中。
当前的方法是将用户名设置为 Principal 并添加附加信息作为 Authentication 对象的附加详细信息,如下所示。
public class CustomAccessTokenConverter extends JwtAccessTokenConverter{
@Override
public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
OAuth2Authentication authentication = super.extractAuthentication(claims);
CustomUserDetails userDetails = new CustomUserDetails ();
userDetails.setUserId(((Integer)claims.get("id")).longValue());
userDetails.setName((String) claims.get("name"));
userDetails.setLastName((String) claims.get("lastName"));
authentication.setDetails(userDetails);
return authentication;
}
}
这种方法的好处是我们可以从应用程序内的任何位置访问自定义 UserDetails。坏事是 Pricipal 对象被困在只是用户的用户名上,我们需要更多的代码来访问自定义的 UserDetails。
// preferable way
(UserAuthDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
// current solution
(UserAuthDetails) ((OAuth2AuthenticationDetails) SecurityContextHolder.getContext().getAuthentication().getDetails()).getDecodedDetails();
是否有更简洁的解决方案来使用JwtAccessTokenConverter,但仍然能够将 Principal 设置为自定义 UserDetails,而不是将其设置为(无用的)用户名并将附加信息作为 Authentication 对象的详细信息发送?
【问题讨论】:
标签: spring-security oauth jwt spring-security-oauth2