对Spring Security+JWT认证,对整体运行流程分析。
第一步先简单了解JWT是什么,生成规则。由于我们是JWT的认证模式,需要一个操作Token的工具类,能够创建token、验证token、反解析token中的信息。
WebSecurityConfigurer
1.引入SpringSecurity依赖,使用security默认的formLogin登录界面.
2.使用自定义身份的验证组件。分析用户名密码验证流程,认证成功后,回跳到 /test 接口。
3.此时暂未涉及到使用JWT。
一 登录请求 formLogin
1、SpringBoot启动后,初始化UserDetailsService,用户认证信息的具体实现类;
2、访问/test接口,拦截跳转到security的form表单,输入用户名、密码提交,
3、执行loadUserByUsername,并实现用户数据访问数据库,认证通过后,返回UserDetails。
4、JwtDaoAuthenticationProvider 使用自定义身份的验证组件,实现密码对比校验。
UserDetailsService
UserDetailsServiceImpl 是用户登录访问数据库具体实现。
执行loadUserByUsername 查询通过后,返回包装好的自定义用户信息。
JwtUserDetails implements UserDetails
JwtAuthenticationProvider extends DaoAuthenticationProvider
使用自定义身份的验证组件, 执行登录认证过程,对用户信息进行认证工作,将密码进行对比校验。
登录时获取用户名和密码,通过authenticationManager.authenticate()方法,最终会调用UserDetailsServiceImpl来获取用户信息(在DaoAuthenticationProvider的retrieveUser中),
然后在DaoAuthenticationProvider的additionalAuthenticationChecks中校验密码。
DaoAuthenticationProvider 是用于解析并认证 UsernamePasswordAuthenticationToken 的这样一个认证服务提供者。
根据 UsernamePasswordAuthenticationToken获取到username,然后调用 UserDetailsService 检索用户详细信息。
密码校验
二 登录接口 /login
1、新增登录接口(不使用formLogin), 执行登录认证过程。
2、认证成功,存储认证信息到上下文。
3、声成令牌并返回给客户端。
JwtAuthenticatioToken
JwtAuthenticatioToken extends UsernamePasswordAuthenticationToken
authenticationManager.authenticate() 是走的 UsernamePasswordAuthenticationManager
向下,执行loadUserByUsername 认证通过后,返回UserDetails
三 token的过滤校验
将登录返回的token 放入test接口的Authority Bearer 中,带上token则可以成功验证并访问接口。
完
资料地址
https://blog.csdn.net/m0_64821673/article/details/122259790
https://blog.csdn.net/typ1805/article/details/110518788
SpringSecurity+JWT实现认证及授权详细步骤
https://blog.csdn.net/sunao1106/article/details/126136701
多个请求共享认证信息
https://blog.csdn.net/yuanlaijike/article/details/84703690