如何获取活动用户的UserDetails

如何获取活动用户的UserDetails

在我的控制器中,当我需要活动(登录)用户时,我正在执行以下操作来获取我的UserDetails实现:

User activeUser = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();log.debug(activeUser.getSomeCustomField());

它工作正常,但我认为Spring可以在这样的情况下让生活更轻松。有没有办法将UserDetails自动装配到控制器或方法?

例如,类似于:

public ModelAndView someRequestHandler(Principal principal) { ... }

但是,而不是得到UsernamePasswordAuthenticationToken,我得到了一个UserDetails

我正在寻找一个优雅的解决方案。有任何想法吗?


肥皂起泡泡
浏览 2348回答 3
3回答

茅侃侃

虽然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

呼唤远方

Spring Security旨在与其他非Spring框架一起使用,因此它没有与Spring MVC紧密集成。默认情况下,Spring Security会Authentication从HttpServletRequest.getUserPrincipal()方法返回对象,因此您将获得作为主体的内容。您可以UserDetails使用以下方法直接从中获取对象UserDetails ud = ((Authentication)principal).getPrincipal()另请注意,对象类型可能会有所不同,具体取决于所使用的身份验证机制(UsernamePasswordAuthenticationToken例如,您可能不会获得),并且Authentication严格来说不必包含a UserDetails。它可以是字符串或任何其他类型。如果您不想SecurityContextHolder直接调用,最优雅的方法(我将遵循)是注入您自己的自定义安全上下文访问器接口,该接口是自定义的,以匹配您的需求和用户对象类型。使用相关方法创建接口,例如:interface MySecurityAccessor {     MyUserDetails getCurrentUser();     // Other methods}然后,您可以通过访问SecurityContextHolder标准实现来实现此功能,从而完全将您的代码与Spring Security分离。然后将其注入需要访问当前用户的安全信息或信息的控制器。另一个主要好处是很容易使用固定数据进行简单的实现测试,而不必担心填充线程本地等等。
打开App,查看更多内容
随时随地看视频慕课网APP