Forráskód Böngészése

jwt登录流程代码分析

UI 2 éve
szülő
commit
394b065ba4

+ 47 - 0
readme.md

@@ -0,0 +1,47 @@
+## JWT登录流程
+
+后端jwt目录
+![](../readme/picture/login_1.jpg)
+
+### 1.首先进入 JwtLoginFilter 类中
+
+该类是一个登陆过滤器,处理表单提交的身份信息,具体则由 UsernamePasswordAuthenticationFilter 类来处理。
+工作流程:验证用户名密码正确后,生成一个token,并将token返回给客户端
+该类继承自 UsernamePasswordAuthenticationFilter ,重写了其中的3个方法
+
++ attemptAuthentication:接收并解析用户凭证。
++ successfulAuthentication:用户成功登录后,这个方法会被调用,我们在这个方法里生成 token。
++ unsuccessfulAuthentication:用户没有登录成功后,调用此方法
+
+#### 1.1 UsernamePasswordAuthenticationFilter [源码](https://blog.csdn.net/m0_51945027/article/details/119608165)
+
+该类继承抽象认证处理器类,作用是处理身份验证的表单提交,并在这个类的构造函数指定了拦截路径,可以给他指定登陆路径。
+![](../readme/picture/login_2.jpg)
+
+#### 1.2 attemptAuthentication
+
+![](../readme/picture/login_3.jpg)
+在 JwtLoginFilter 中,通过 attemptAuthentication() 方法来获取表单中的用户名和密码,封装进 ArrayList 数组中,并通过 authentication() 方法(即authenticationManager.authenticate())来认证。
+
+#### 1.3 attemptAuthentication() 工作流程
+
+![](../readme/picture/login_4.jpg)
+过程:所有的认证请求(比如login)都会通过提交一个 token 给 AuthenticationManager 的 authenticate() 方法来实现。当然事情肯定不是它来做,具体校验动作会由 AuthenticationManager 将请求转发给具体的实现类来做。
+
++ 先通过 req.getContentType() 方法获取获取请求头信息中 Content-Type 字段的值,判空
++ 创建 User 对象
++ 创建 ObjectMapper 类,以便将各个类型和 Json 类型相互转换
++ 先通过反射获取 user 类,再调用 getUsername 获得输入的用户名
++ 此时 UsernamePasswordAuthenticationToken 继承 AbstractAuthenticationToken 实现 Authentication ,所以当在页面中输入用户名和密码之后首先会进入到UsernamePasswordAuthenticationToken 验证( Authentication )
++ 然后生成的 Authentication 会被交由 AuthenticationManager 来进行管理,此处的 getAuthenticationManager() 来获取用户认证的管理类。而 AuthenticationManager 管理一系列的 AuthenticationProvider,而每一个 Provider 都会通 UserDetailsService 和 UserDetail 来返回一个以 UsernamePasswordAuthenticationToken 实现的带用户名和密码以及权限的 Authentication
+
+#### 1.5 [Authentication核心组件](https://zhuanlan.zhihu.com/p/85489737)
+
+createAuthentication,token打印后:
+![](../readme/picture/createtoken.jpg)
+
+createToken()方法使用了构建器模式(Jwt.builder().build())
+
+```java
+public interface JwtBuilder extends ClaimsMutator<JwtBuilder> {
+```

BIN
readme/picture/createtoken.jpg


BIN
readme/picture/login.jpg


BIN
readme/picture/login_1.jpg


BIN
readme/picture/login_2.jpg


BIN
readme/picture/login_3.jpg


BIN
readme/picture/login_4.jpg