写点什么

springsecurity 从当前请求对象中获取用户信息

作者:周杰伦本人
  • 2022 年 5 月 05 日
  • 本文字数:863 字

    阅读完需:约 3 分钟

springsecurity 从当前请求对象中获取用户信息

从当前请求对象中获取用户信息

SpringMVC 中 Controller 的请求参数都是当前请求 HttpServletRequest 带来的,Authentication Principal 也是 HttpServletRequest 带来的,在 Controller 层我们拿到的是 HttpServletRequest 的实例是 Servlet3SecurityContextHolderAwareRequestWrapper

Servlet3SecurityContextHolderAwareRequestWrapper

Servlet3SecurityContextHolderAwareRequestWrapper 继承 SecurityContextHolderAwareRequestWrapper 主要看一下 SecurityContextHolderAwareRequestWrapper


  • getAuthentication: 获取当前登录对象 Authentication 不是匿名返回 是匿名返回 null

  • getRemoteUser: 返回当前登录的用户名 即 Authentication 中的 Principal 信息

  • getUserPrincipal:返回当前登录对象

  • isGranted: 判断是否有指定角色

  • isUserInRole:调用 isGranted

SecurityContextHolderAwareRequestFilter

那么 Security 如何将默认请求转化为 Servlet3SecurityContextHolderAwareRequestWrapper 的呢?


是在过滤器链 SecurityContextHolderAwareRequestFilter 中实现的,SecurityContextHolderAwareRequestFilter 主要作用就是对 HttpServletRequest 请求进行再包装,重写 HttpServletRequest 和安全管理相关的方法。


SecurityContextHolderAwareRequestFilter 源码:


doFilter 方法中调用 requestFactory.create 方法 该方法直接创建了 Servlet3SecurityContextHolderAwareRequestWrapper 实例。然后 SpringMVC 的 ServletRequestMethodArgumentResolver 的 resolveArgument 解析出 Principal 对象 Authentication 对象。

总结

从上面的源码分析中,我们可以感受到 springsecurity 是如何从当前请求对象中获取用户信息的,理解了这一点,我们在使用 spring security 的时候才能游刃有余,spring security 中重要的就是过滤器链,我们还要理解它的责任链的设计模式的思想,而这篇文章中设计的过滤器链就是 SecurityContextHolderAwareRequestFilter,它的功能和作用在文章也有介绍,主要作用就是对 HttpServletRequest 请求进行再包装,重写 HttpServletRequest 和安全管理相关的方法。

发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2020.02.29 加入

还未添加个人简介

评论

发布
暂无评论
springsecurity从当前请求对象中获取用户信息_5月月更_周杰伦本人_InfoQ写作社区