Spring Security获取用户信息

  1. 自定义user注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginTblUser {
    /**
     * 是否查询User对象所有信息,true则通过rpc接口查询
     */
//    boolean isFull() default false;
}
  1. 实现方法参数解析接口 HandlerMethodArgumentResolver
@Slf4j
public class XqTokenArgumentResolver implements HandlerMethodArgumentResolver {
	/**
	 * 入参筛选
	 *
	 * @param methodParameter 参数集合
	 * @return 格式化后的参数
	 */
	@Override
	public boolean supportsParameter(MethodParameter methodParameter) {
	//判断使用注解的对象是否为用户对象,是则执行resolveArgument方法
		return methodParameter.hasParameterAnnotation(LoginTblUser.class) && methodParameter.getParameterType().equals(Tbluser.class);
	}

	/**
	 * @param methodParameter       入参集合
	 * @param modelAndViewContainer model 和 view
	 * @param nativeWebRequest      web相关
	 * @param webDataBinderFactory  入参解析
	 * @return 包装对象
	 */
	@Override
	public Object resolveArgument(MethodParameter methodParameter,
								  ModelAndViewContainer modelAndViewContainer,
								  NativeWebRequest nativeWebRequest,
								  WebDataBinderFactory webDataBinderFactory) {
		//获取注解对象						  
		LoginTblUser loginUser = methodParameter.getParameterAnnotation(LoginTblUser.class);
		HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
		String userId = request.getHeader(SecurityConstants.USER_ID_HEADER);

		if(StringUtils.isEmpty(userId)){
			throw new GetUserInfoException("未获取到用户信息");
		}
		String username = request.getHeader(SecurityConstants.USER_HEADER);
		try {
			username = URLDecoder.decode(username,"UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
//		String roles = request.getHeader(SecurityConstants.ROLE_HEADER);
//		if (StrUtil.isBlank(username)) {
//			log.warn("resolveArgument error username is empty");
//			return null;
//		}
		Tbluser user = new Tbluser();
		user.setUsercode(userId);
		user.setUsername(username);
		return user;
	}
}
  1. 实现WebMvcConfigurer接口重写addArgumentResolvers方法将XqTokenArgumentResolver类添加进argumentResolvers中。
public class DefaultWebMvcConfig implements WebMvcConfigurer {
	@Lazy
	@Autowired
	//**如需查询用户全部信息,可以在此注入service,将他作为参数传入方法参数解析实现类中的构造函数中,在resolveArgument方法中查询**
	private UserService userService;

	/**
	 * Token参数解析
	 *
	 * @param argumentResolvers 解析类
	 */
	@Override
		public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
		//注入用户信息
		argumentResolvers.add(new TokenArgumentResolver(userService));
		//注入应用信息
		argumentResolvers.add(new ClientArgumentResolver());
		argumentResolvers.add(new XqTokenArgumentResolver());
	}
}

4.使用方法:在controller里,需要获取用户信息的在方法中使用注解@LoginTblUser(注解为上自定义注解) 标注在用户对象前即可

	/**
	 * 修改试验机台资料
	 */
	@ApiOperation("修改试验机台资料")
	@PutMapping
	public ResponseResult edit(@RequestBody LimsDevice limsDevice, @LoginTblUser Tbluser tbluser) {
		limsDevice.setMuser(tbluser.getUsercode());
		return limsDeviceService.updateLimsDevice(limsDevice);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值