栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java 如何获取活动用户的UserDetails

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 如何获取活动用户的UserDetails

序言:从Spring-Security 3.2开始@AuthenticationPrincipal,此答案的末尾描述了一个不错的注释。当你使用Spring-Security> = 3.2时,这是最好的方法。

当你:

使用较旧版本的Spring-Security,
需要通过存储在主体中的某些信息(例如登录名或ID)从数据库加载你的自定义用户对象,
想要了解a

HandlerMethodArgumentResolver
或如何
WebArgumentResolver
以一种优雅的方式解决此问题,或者只是想要了解
@AuthenticationPrincipaland
的背景
AuthenticationPrincipalArgumentResolver
(因为它基于
HandlerMethodArgumentResolver

然后继续阅读-否则,请使用
@AuthenticationPrincipal
并感谢
Rob Winch
(的作者
@AuthenticationPrincipal
)和
Lukas Schmelzeisen
(的回答)。


(顺便说一句:我的回答有点老(2012年1月),因此是Lukas Schmelzeisen作为第一个使用@AuthenticationPrincipal基于Spring Security 3.2 的注释解决方案的人。)

然后你可以在控制器中使用

public ModelAndView someRequestHandler(Principal principal) {   User activeUser = (User) ((Authentication) principal).getPrincipal();   ...}

如果你需要一次,那没关系。但是,如果你因其丑陋的原因而需要它的几倍,因为它会污染你的控制器的基础结构详细信息,通常框架应该将其隐藏。

因此,你可能真正想要的是拥有这样的控制器:

public ModelAndView someRequestHandler(@ActiveUser User activeUser) {   ...}

因此,你只需要实现即可WebArgumentResolver。它有一种方法

Object resolveArgument(MethodParameter methodParameter,        NativeWebRequest webRequest)        throws Exception

这将获取Web请求(第二个参数),并且User如果感觉对方法参数(第一个参数)负责,则必须返回。

从Spring 3.1开始,有一个新概念称为HandlerMethodArgumentResolver。如果使用Spring 3.1+,则应该使用它。(此答案的下一部分对此进行了说明)

public class CurrentUserWebArgumentResolver implements WebArgumentResolver{   Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) {        if(methodParameter is for type User && methodParameter is annotated with @ActiveUser) {Principal principal = webRequest.getUserPrincipal();return (User) ((Authentication) principal).getPrincipal();        } else {return WebArgumentResolver.UNRESOLVED;        }   }}

你需要定义自定义注释-如果应始终从安全上下文中获取User的每个实例,但绝不要将其作为命令对象,则可以跳过它。

@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@documentedpublic @interface ActiveUser {}

在配置中,你只需要添加以下内容:

<bean     id="applicationConversionService">    <property name="customArgumentResolver">        <bean />    </property></bean>

@See:学习自定义Spring MVC @Controller方法参数

应该注意的是,如果你使用的是Spring 3.1,他们建议使用HandlerMethodArgumentResolver而不是WebArgumentResolver。-见周杰伦的评论

HandlerMethodArgumentResolverSpring 3.1+
相同

public class CurrentUserHandlerMethodArgumentResolver         implements HandlerMethodArgumentResolver {     @Override     public boolean supportsParameter(MethodParameter methodParameter) {          return   methodParameter.getParameterAnnotation(ActiveUser.class) != null   && methodParameter.getParameterType().equals(User.class);     }     @Override     public Object resolveArgument(MethodParameter methodParameter,   ModelAndViewContainer mavContainer,   NativeWebRequest webRequest,   WebDataBinderFactory binderFactory) throws Exception {          if (this.supportsParameter(methodParameter)) {   Principal principal = webRequest.getUserPrincipal();   return (User) ((Authentication) principal).getPrincipal();          } else {   return WebArgumentResolver.UNRESOLVED;          }     }}

在配置中,你需要添加此

<mvc:annotation-driven>      <mvc:argument-resolvers><bean />    </mvc:argument-resolvers> </mvc:annotation-driven>

@See 利用Spring MVC 3.1 HandlerMethodArgumentResolver接口

Spring-Security 3.2解决方案
spring安全3.2(不使用Spring 3.2混淆)在溶液中有自己的编译:@AuthenticationPrincipal(org.springframework.security.web.bind.annotation.AuthenticationPrincipal)。Lukas Schmelzeisen的回答对此进行了很好的描述。

只是在写

ModelAndView someRequestHandler(@AuthenticationPrincipal User activeUser) {    ... }

要使此工作正常进行,你需要注册

AuthenticationPrincipalArgumentResolver(org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver)
:通过“激活”
@EnableWebMvcSecurity
或在其中注册此Bean,
mvc:argument-resolvers
这与我在上面的Spring 3.1解决方案中描述的方式相同。

@请参阅《Spring Security 3.2参考》的第11.2章。@AuthenticationPrincipal

Spring-Security 4.0解决方案
它的工作方式类似于Spring 3.2解决方案,但在Spring 4.0中,

@AuthenticationPrincipal和AuthenticationPrincipalArgumentResolver
被“移动”到另一个软件包中:

  • org.springframework.security.core.annotation.AuthenticationPrincipal
  • org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver

(但是旧包中的旧类仍然存在,因此请不要混合使用!)

只是在写

import org.springframework.security.core.annotation.AuthenticationPrincipal;ModelAndView someRequestHandler(@AuthenticationPrincipal User activeUser) {    ...}

要使此工作正常进行,你需要注册

(org.springframework.security.web.method.annotation.)AuthenticationPrincipalArgumentResolver
:通过“激活”
@EnableWebMvcSecurity
或在其中注册此Bean,
mvc:argument-resolvers
这与我在上面的Spring 3.1解决方案中描述的方式相同。

<mvc:annotation-driven>    <mvc:argument-resolvers>        <bean  />    </mvc:argument-resolvers></mvc:annotation-driven>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/430236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号