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
TA贡献1856条经验 获得超11个赞
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分离。然后将其注入需要访问当前用户的安全信息或信息的控制器。
另一个主要好处是很容易使用固定数据进行简单的实现测试,而不必担心填充线程本地等等。
添加回答
举报