Keine Beschreibung

UI e510d19328 groundstation vor 2 Jahren
config fdeff22d27 ground_station vor 2 Jahren
picture c4afef91a0 jwt源码分析 vor 2 Jahren
src e510d19328 groundstation vor 2 Jahren
.gitignore fdeff22d27 ground_station vor 2 Jahren
mvnw fdeff22d27 ground_station vor 2 Jahren
mvnw.cmd fdeff22d27 ground_station vor 2 Jahren
pom.xml fdeff22d27 ground_station vor 2 Jahren
readme.md c4afef91a0 jwt源码分析 vor 2 Jahren

readme.md

JWT登录流程

后端jwt目录

1.首先进入 JwtLoginFilter 类中

该类是一个登陆过滤器,处理表单提交的身份信息,具体则由 UsernamePasswordAuthenticationFilter 类来处理。 工作流程:验证用户名密码正确后,生成一个token,并将token返回给客户端 该类继承自 UsernamePasswordAuthenticationFilter ,重写了其中的3个方法

  • attemptAuthentication:接收并解析用户凭证。
  • successfulAuthentication:用户成功登录后,这个方法会被调用,我们在这个方法里生成 token。
  • unsuccessfulAuthentication:用户没有登录成功后,调用此方法

1.1 UsernamePasswordAuthenticationFilter 源码

该类继承抽象认证处理器类,作用是处理身份验证的表单提交,并在这个类的构造函数指定了拦截路径,可以给他指定登陆路径。

1.2 attemptAuthentication

在 JwtLoginFilter 中,通过 attemptAuthentication() 方法来获取表单中的用户名和密码,封装进 ArrayList 数组中,并通过 authentication() 方法(即authenticationManager.authenticate())来认证。

1.3 attemptAuthentication() 工作流程

过程:所有的认证请求(比如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核心组件

createAuthentication,token打印后:

createToken()方法使用了构建器模式(Jwt.builder().build())

public interface JwtBuilder extends ClaimsMutator<JwtBuilder> {