Spring Boot 中JWT和JJWT的相关知识

 

Spring Boot提供了多种安全机制来保护应用程序和数据的安全性。以下是一些常见的安全机制:

  1. 认证(Authentication):Spring Boot支持多种认证机制,包括基于表单、HTTP Basic、HTTP Digest、OAuth等认证方式。使用这些机制,用户需要提供有效的凭证才能进行身份验证,以访问受保护的资源。

  2. 授权(Authorization):Spring Boot集成了基于角色的授权机制。通过配置角色和权限,可以限制用户对资源的访问权限。可以使用注解或基于URL的授权规则来实现细粒度的授权控制。

  3. 密码加密(Password Encryption):Spring Boot提供了密码加密的支持,以确保用户密码在存储和传输时的安全性。可以使用Spring Security的PasswordEncoder接口来对密码进行哈希和加密。

  4. 防止跨站脚本攻击(Cross-Site Scripting, XSS):Spring Boot提供了内置的防止XSS攻击的机制,通过自动转义用户输入的HTML字符,以防止恶意脚本注入。

  5. 防止跨站请求伪造(Cross-Site Request Forgery, CSRF):Spring Boot内置了CSRF防护机制,在表单提交时生成和验证随机token,以防止恶意请求。

在Spring Boot 安全中随着时代的发展,用户认证的方式也发生了一系列的变化。传统的Cookie、Session 验证方式存在跨域和扩展性的限制,Token验证方式成立一个很好的代替方式,而JWT(JSON Web Token)是一个不错的选择。当我们的管理系统是一个前端后端分离的项目,我们就可以通过JJWT(Java JSON Wed Token)库实现资产的管理系统中的登录认证功能。

本文主要介绍JWT的相关知识和JJWT的相关知识

JWT(JSON Web Token)是一种使用JSON格式进行安全传输信息的开放标准。它由三个部分组成,即头部(Header)、载荷(Payload)和签名(Signature)。

  1. 头部(Header):头部通常由两部分组成,一个是令牌的类型,即JWT,另一个是使用的签名算法,如HMAC、SHA256等。头部使用Base64 URL编码后的字符串,用于描述令牌的元数据。

  2. 载荷(Payload):载荷是令牌的主要内容,通常包含了一些声明和数据。声明有标准声明(如iss:发行者、exp:过期时间)和自定义声明(根据需求添加的任意数据)。载荷也被Base64 URL编码后的字符串。

  3. 签名(Signature):签名是JWT的第三部分,它用于验证消息的完整性和真实性。签名使用头部和载荷的组合加上一个密钥进行加密生成,用于验证令牌在传输过程中是否被篡改。

JWT认证流程:

  1. 用户向服务器发送身份认证请求(通常是提供用户名和密码)。
  2. 服务器验证身份信息,并生成一个JWT作为响应,包含用户的身份信息和其他所需的数据。
  3. 服务器将JWT发送回客户端进行保存,通常是存储在客户端的Cookie或本地存储中。
  4. 客户端在后续请求中将JWT发送到服务器作为身份验证凭证。
  5. 服务器验证JWT的签名以及其中的数据,如果验证通过,则认为用户身份有效。

流程图如下:

JWT具有以下优势:

  1. 无状态:服务器不需要在后端存储任何会话信息,每个请求都包含了必要的用户信息。
  2. 可扩展:可以在载荷中添加自定义的字段,以满足不同的应用需求。
  3. 跨平台:由于使用标准的JSON格式,JWT可以在不同编程语言和平台之间进行传递和解析。

而我们需要注意的是,使用JWT需要确保令牌在传输过程中的安全性,例如使用HTTPS来保护通信安全。另外,JWT不适合存储敏感信息,因为令牌可以被解码,但通常不会被修改。

 

JJWT(Java JWT)是Java平台上一个用于创建和解析JWT的库。它提供了简单易用的API,使开发人员能够轻松地生成、验证和解码JWT。

下面是JJWT库的一些主要特性和功能:

  1. 创建和签名JWT:JJWT提供了一组简单的API来创建和签名JWT。可以指定头部、载荷和签名所需的信息,并通过指定密钥来对JWT进行签名。

  2. 解析和验证JWT:使用JJWT,可以轻松地解析和验证JWT的合法性。可以验证JWT的签名以确保其完整性和真实性,同时还可以验证JWT是否在有效期内。

  3. 支持不同的加密算法:JJWT支持各种常见的加密算法,如HMAC、RSA、ECDSA等,以满足不同的需求。可以根据需要选择适合的算法来创建和验证JWT。

  4. 轻量级和简单易用:JJWT是一个轻量级的库,易于集成到现有的Java项目中。它提供了简单而直观的API,使开发人员能够快速上手并使用JWT。

  5. 可扩展性:JJWT具有良好的可扩展性,可以根据需要自定义和扩展功能。可以添加自定义的声明和数据到JWT的载荷中,以满足应用程序的特定需求。

使用Spring Boot 整合 JJWT 实现登录认证,步骤如下:

1.在数据库MySQL中创建用户信息表t_user,如下表:

用户信息表结构
字段类型是否为空备注
idint用户ID(主键)
namevarchar用户名
pwdvarchar登录密码

创建用户信息表脚本及初始化脚本,代码如下:

--创建数据表:t_user
DROP TABLE IF EXISTS t_user;
CREATE TABLE IF NOT EXISTS t_user
(
    id INT PRIMARY KEY COMMENT '用户ID(主键)',
    name VARCHAR(255) UNIQUE NOT NULL COMMENT'用户名',
    pwd VARCHAR(20) NOT NULL COMMENT '登录密码'
) COMMENT = '用户信息表';
INSERT INTO t_user(id, name, pwd)
VALUE(1,'zhangsan','123');

2.创建一个名为jwtauthenticationtest的Spring Boot 项目。

3.在 pom.xml 文件中引入JJWT、MyBatis、knife4j等依赖代码如下:

<!--引入JJWT依赖-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
<!--引入MyBatis依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>
<!--引入Lombok依赖-->
<dependency>
    <groupId>org.project1ombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>
<!--引入Druid依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.19</version>
</dependency>
<!--引入Mysql依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--引入knife4j依赖-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>2.0.3</version>
</dependency>

4.在application.properties配置文件中编写数据库连接信息并对MyBatis进行配置,代码如下:

# 应用名称
spring.application. name=jwtauthenticationtest
# 应用服务 Web 访问端口
server.port=8989
spring.datasource.type=com.alibaba.druid.pool.DruidDatasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?
useUnicode=true&characterEncoding-utf8&
nullCatalogMeansCurrent=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123
mybatis. type-aliases-package=cn.js.ccit.pojo
mybatis.mapper-locations=olasspath:cn/js/ocit/mapper/*.xml
logging.level.com.baizhi.dao-debug

5.在cn.js.ccit.pojo包中创建实体类User,代码如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok. NoArgsConstructor;
import lombok.experimental.Accessors;
@NOArgsConstructor
@Al1ArgsConstructor
@Data
@Accessors(chain=true)
public class User {
    private String id;
    private String name;
    private String pwd;
}

6.在cn.js.ccit.mapper包中创建UserMapper接口,定义一个login方法,代码如下:

@Mapper
@Repository
public interface UserMapper (
    User login(User user);
)

7.在resources/cn/js/ccit/mapper目录下创建UserMapper.xml文件,代码如下:

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.js.ccit.mapper.UserMapper">
    <!-- User login(User user);-->
   <select id="login" parameterType="cn.js.ccit.pojo.User"                                             
    resultType="cn.js.ccit.pojo.User">
        select * from t_user where name=#(name) and pwd = #{pwd}
    </select>
</mapper>

7.在cn.js.ccit.utils包中创建UserService接口及其实现类UserServiceImpl,daimarx:

public interface UserService{
    User login(User user);//登录
}
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    @Transactional(propagation = Propagation.SUPPORTS)
    public User login(User user) {
    //根据接收的用户名和密码查询数据库
    User userDB = userMapper.login(user);
    if(userDB!=null){
        return userDB;
    }
    throw new RunException("登录失败!");
    }
}

 总结:Spring Boot 和 JJWT 的集成使得在 Java 应用程序中使用 JWT 变得非常简单,不仅可以轻松创建和验证 JWT,还提供了多种加密和解密算法供选择。使用 JWT,可以实现更加安全的身份验证和授权,适用于各种不同的场景。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值