Skip to content

SellerJoke/SimplestJwtAuthentication

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

极简JWT认证

一、简介

本项目用于演示JWT登录认证,致力于用尽量少且简单易懂的代码实现JWT登录认证。

二、实现思路

Spring Security保护Web应用,主要依靠安全过滤器链。请求必须先经过安全过滤器链才能到达Controller。Spring Security通过向安全过滤器链添加过滤器实现特定安全功能,例如向安全过滤器链添加UsernamePasswordAuthenticationFilter实现表单登录的核心功能。因此使用Spring Security实现JWT登录认证,最重要的是实现JWT登录认证的过滤器,然后再加上一些额外的配置。

1. 核心过滤器

要实现JWT登录认证,关键部分是2个过滤器:JWT登录过滤器和JWT解析过滤器。

(1) JWT登录过滤器

JWT登录过滤器实现用户登录功能。它由JwtLoginFilter类实现。
工作流程如下。

  1. JWT登录过滤器检测到用户的登录请求,就会执行登录流程。
  2. 从请求中解析出用户凭据(通常是用户名和密码)。
  3. 使用Spring Security的AuthenticationManager进行身份验证。
  4. 如果身份验证成功,就生成一个JWT,并将其作为响应返回给客户端。
  5. 如果身份验证失败,就返回一个错误响应。

(2) JWT解析过滤器

JWT解析过滤器用于解析请求中的JWT,并验证其有效性。它由JWTParseFilter类实现。
工作流程如下。

  1. JWT解析过滤器检查所有请求,获取请求头"Authorization"。
  2. 如果不存在"Authorization"请求头或该请求头的值不以"Bearer "开头,则跳过该此过滤器。
  3. 如果"Authorization"请求头符合规范,将"Authorization"请求头(即JWT)解析为用户认证对象并验证。
  4. 如果解析并验证JWT成功,则将解析成的用户认证对象保存到安全上下文中。
  5. 如果未能成功解析JWT,则给用户返回错误信息。

2. 过滤器链

JWT认证与Spring Security自带的其他验证方式有些区别,因此需要修改Spring Security的默认配置。
下面是配置流程。具体配置可查看SecurityConfiguration#securityFilterChain()方法。

(1) 添加JWT登录过滤器和JWT解析过滤器到安全过滤器链

(2) 取消不需要的功能

由于JWT认证本身就可以防御跨站攻击,因此移除CSRF防护。
由于JWTParseFilter完成了SecurityContextHolderFilter的工作,因此移除SecurityContextHolderFilter。
由于JWT是无状态的,不需要会话,所有移除会话管理。
禁用请求缓存。

(3) 配置跨域资源共享

使用JWT的应用通常是前后端分离的。如果不使用反向代理,前端服务器和后端服务器不在同一域上。用户在前端网页向后端发送的请求属于跨域请求。浏览器对跨域请求有严格的限制,除非后端服务器主动解除这种限制,因此需要配置跨域资源共享。
此项具体配置可查看SecurityConfiguration#corsConfigurationSource()方法。

3. 用户身份信息存储

要实现用户认证就必须提供查询和修改用户信息的手段。在Spring Security中,用户信息通过UserDetailsService接口查询。因此要实现用户信息存储,就得提供一个实现UserDetailsService接口的Bean。
在本应用中,使用InMemoryUserDetailsManager类提供用户信息查询和修改服务。这个类把用户信息保存在内存中,而不是数据库中。这种操作是不安全的,一旦应用关闭,所有用户数据都会丢失。由于这是个演示项目,对与JWT登录认证关联不大的部分不过多关注,读者可以自行学习如何从数据库中存取用户信息。
具体配置可查看SecurityConfiguration#inMemoryUserDetailsManager()方法。

三、关键依赖项

1. Spring Web

JWT登录认证是为了保护网络请求,这是实现网络服务器的必选项。

2. Spring Security

本项目使用Spring Security的基础设施实现JWT登录认证。

3. jjwt

jjwt是Java中用于生成和解析JWT的库。

4. Lombok

Lombok是一个Java库,用于生成POJO的一些基础方法。

四、使用方法

启动应用后,用浏览器打开localhost,可以看到展示应用功能的页面。
未登陆状态时显示登录框。
本项目提供两个默认用户。用户1:用户名 - admin,密码 - admin,角色 - ADMIN;用户2:用户名 - user,密码 - password,角色 - USER。
用户登录成功后,登录框会隐藏,并显示JSON交互界面。
本应用提供2个JSON交互功能。
第一个功能是从后端获取用户名。
第二个功能是访问只有ADMIN角色才能访问的端口。
另外,还提供一个注销功能。注销只需要删除客户端本地保存的JWT,不需要后端参与。

About

一个使用Spring Security的JWT认证的极简实现

Resources

Stars

Watchers

Forks

Packages

No packages published