为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取活动用户的UserDetails

如何获取活动用户的UserDetails

肥皂起泡泡 2019-07-25 15:54:45
如何获取活动用户的UserDetails在我的控制器中,当我需要活动(登录)用户时,我正在执行以下操作来获取我的UserDetails实现:User activeUser = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();log.debug(activeUser.getSomeCustomField());它工作正常,但我认为Spring可以在这样的情况下让生活更轻松。有没有办法将UserDetails自动装配到控制器或方法?例如,类似于:public ModelAndView someRequestHandler(Principal principal) { ... }但是,而不是得到UsernamePasswordAuthenticationToken,我得到了一个UserDetails?我正在寻找一个优雅的解决方案。有任何想法吗?
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

虽然Ralphs Answer提供了一个优雅的解决方案,但使用Spring Security 3.2,您不再需要实现自己的解决方案ArgumentResolver

如果您有UserDetails实现CustomUser,您可以这样做:

@RequestMapping("/messages/inbox")public ModelAndView findMessagesForUser(@AuthenticationPrincipal CustomUser customUser) {

    // .. find messages for this User and return them...}

请参阅Spring Security Documentation:@AuthenticationPrincipal


查看完整回答
反对 回复 2019-07-25
?
呼唤远方

TA贡献1856条经验 获得超11个赞

Spring Security旨在与其他非Spring框架一起使用,因此它没有与Spring MVC紧密集成。默认情况下,Spring Security会AuthenticationHttpServletRequest.getUserPrincipal()方法返回对象,因此您将获得作为主体的内容。您可以UserDetails使用以下方法直接从中获取对象

UserDetails ud = ((Authentication)principal).getPrincipal()

另请注意,对象类型可能会有所不同,具体取决于所使用的身份验证机制(UsernamePasswordAuthenticationToken例如,您可能不会获得),并且Authentication严格来说不必包含a UserDetails。它可以是字符串或任何其他类型。

如果您不想SecurityContextHolder直接调用,最优雅的方法(我将遵循)是注入您自己的自定义安全上下文访问器接口,该接口是自定义的,以匹配您的需求和用户对象类型。使用相关方法创建接口,例如:

interface MySecurityAccessor {

    MyUserDetails getCurrentUser();

    // Other methods}

然后,您可以通过访问SecurityContextHolder标准实现来实现此功能,从而完全将您的代码与Spring Security分离。然后将其注入需要访问当前用户的安全信息或信息的控制器。

另一个主要好处是很容易使用固定数据进行简单的实现测试,而不必担心填充线程本地等等。


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 2345 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信