SpringBoot整合Spring Security

Spring Security认证流程

Spring Security认证流程如下图:

(1) 用户发起表单登录请求后,首先进入UsernamePasswordAuthenticationFilter,UsernamePasswordAuthenticationFilter根据用户输入的用户名、密码构建了 UsernamePasswordAuthenticationToken,并将其交给 AuthenticationManager来进行认证处理。

AuthenticationManager是一个认证管理器,它定义了Spring Security如何执行认证操作,如果认证成功后,AuthenticationManager会返回一个Authentication对象设置到SecurityContextHolder中。AuthenticationManager是一个接口,它的默认实现类也是我们使用最多的实现类是ProviderManager。

(2) 在Spring Security中通常同时支持多种认证方式,不同的认证方式对应不同的AuthenticationProvider,因此在ProviderManager中存在一个AuthenticationProvider列表,ProviderManager会对列表中每一个AuthenticationProvider执行认证,最终得到认证结果。

(3) 传统的表单登录的 AuthenticationProvider 主要是由 AbstractUserDetailsAuthenticationProvider 来进行处理的,重点看下它的 authenticate()方法。

首先通过 retrieveUser() 方法读取到数据库中的用户信息,retrieveUser() 的具体实现在 DaoAuthenticationProvider 中,代码如下,loadUserByUsername()方法会返回一个UserDetails对象,这个对象封装了用户信息以及对应的权限信息,然后开始认证。UserDetailsService:SpringSecurity定义的核心接口,用于根据用户名获取用户信息,需要自行实现;UserDetails:Spring Security定义用于封装用户信息的类(主要是用户信息和权限),需要自行实现。

(4) 认证校验分为 前校验、附加校验和后校验,如果任何一个校验出错,就会抛出相应的异常。

(5) 所有校验都通过后,调用 createSuccessAuthentication() 返回认证信息,createSuccessAuthentication 方法重新 new 了一个 UsernamePasswordAuthenticationToken,因为到这里认证已经通过了,所以将 authorities 注入进去,并设置 authenticated 为 true,即需要认证。

(6) 至此认证信息就被传递回 UsernamePasswordAuthenticationFilter 中,在 UsernamePasswordAuthenticationFilter 的父类 AbstractAuthenticationProcessingFilter 的 doFilter() 中,会根据认证的成功或者失败调用相应的 handler。

总结

  1. 当用户提交登录请求时,UsernamePasswordAuthenticationFilter会从当前请求HttpServletRequest中提取出登录用户名/密码;
  2. 拿到账户、密码后创建出一个UsernamePasswordAuthenticationToken对象,然后调用getAuthenticationManager().authenticate方法进行认证;
  3. 进入到我们前面说的ProviderManager的流程中;
  4. 如果认证失败,则SecurityContextHolder中相关信息将被清除,登陆失败回调也会被调用;
  5. 如果认证成功,则会进行登录信息存储,Session并发处理,登陆成功事件发布以及登陆成功方法回调等。

转载:
https://blog.51cto.com/u_13478207/3337065
https://www.cnblogs.com/wangstudyblog/p/14789712.html

posted @   学海无涯#  阅读(197)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示