springsecurity 从当前请求对象中获取用户信息
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 和安全管理相关的方法。
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/11b737725b5057d4dab548845】。文章转载请联系作者。
评论