【发布时间】:2016-01-09 18:46:47
【问题描述】:
上周我开始扩展 UserDetails 类以支持自定义字段。这个字段的特殊之处在于它填充了一个取决于请求参数的值。我设法正确地实现了这一点(所以问题不集中于此)。
现在的问题是,在成功登录后,UserDetails 对象被正确填充(我能够使用 AuthenticationSuccessHandler 看到这一点)并且客户端从 OAuth2 提供程序接收到 JWT 令牌。然后,客户端尝试通过访问“/uaa/user”端点来获取有关用户的更多详细信息。这设置为返回 Principal 对象。但是在检查了 Principal 对象的内容后,我惊讶地发现 UserDetails 对象丢失了。 getPrincipal() 方法只返回用户名而不是 UserDetails 对象。
根据this question,这是登录失败的结果。 AuthenticationToken(在本例中为 UsernamePasswordAuthenticationToken)被 AuthenticationManager 拒绝。我不知道为什么它应该做这样的事情。使用默认 UserDetails 对象的身份验证似乎工作得很好。有人可以帮我解决这个问题吗?
实现类的一些细节(如上所述)。由于某些原因,这里省略了一些代码。
自定义用户详情
public class CustomUserDetails extends User {
private final Integer custom;
public CustomUserDetails (...default params..., Integer custom) {
super(...default params...);
this.custom = custom;
}
}
CustomUserDetailsService
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public CustomUserDetails loadUserByUsername(String username) throw UsernameNotFoundException {
return new CustomUserDetails(...default params..., 12345);
}
}
配置
@Autowired
private CustomUserDetails userDetails;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetails);
}
用户端点
@RequestMapping(value = "/user", method = RequestMethod.GET)
@ResponseBody
public Principal getDetails(Principal user) {
return user;
}
此处返回的 Principal 对象内部应包含 UserDetails 对象,并应将其返回给客户端。但是,当您调用 getPrincipal(); 时,它只会返回带有用户名的字符串;
最后,我希望用户端点(返回 Principle 对象)返回的 JSON 包含我添加到 UserDetails 的自定义字段。
提前致谢。
【问题讨论】:
-
你能显示更多细节或更好地链接到你的项目,比如github吗?所以我们可以通过跟踪代码轻松发现问题。
-
您尝试将
@AuthenticationPrincipal CustomUserDetails details作为getDetails方法参数吗? -
我完全忘记了这个问题。我们最终使用了一种不同的方法来获取用户详细信息(改为调用用户微服务端点)。但为了回答这个问题,我会尝试找到一个不涉及单独应用程序的解决方案。
-
我使用的是 MongoDB 和 OAuth2。我必须像 github.com/gtiwari333/floop/blob/master/src/main/java/io/floop/… 一样使用 Converter 到 OAuth2Authentication 对象
标签: spring spring-security spring-security-oauth2