Springboot+SpringSecurity+JWT整合
一、什么是SpringSecurity和JWT
-
SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架。
为Java应用程序提供身份验证和授权
-
JWT(JSON Web Token)目前最流行的跨域认证解决方案。
参考资料:
二、为什么用SpringSecurit+JWT实现授权验证
-
基于session的认证
http协议是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了。
session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,在分布式的应用上,相应的限制了负载均衡器的能力。
-
基于token的认证
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息,不需要去考虑用户在哪一台服务器登录。
三、整合
代码参考:若依管理系统
-
环境准备
pom:Demo使用的是多模块的项目结构
<!-- 父pom springboot 2.4.0--> <dependencies> <!-- hutool工具 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.5.8</version> </dependency> <!-- mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.30</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<!-- 子pom --> <dependencies> <!--jwt--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <!-- security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies>
配置文件:
spring: #mysql datasource: url: jdbc:mysql://localhost:3306/ry-vue?serverTimezone=UTC password: 123 username: root driver-class-name: com.mysql.cj.jdbc.Driver # token配置 jwt: # 令牌自定义标识 header: Authorization # 令牌密钥 字符不能少于4个 secret: kkkkk # 令牌有效期(单位毫秒) expireTime: 60000 # 令牌头 tokenPrefix: Bird-
-
代码编写
-
编写实体类,业务接口,控制器
pojo参考ruoyi源码
UserMapper.java
@Mapper public interface UserMapper extends BaseMapper<SysUser> { /** * 根据账户名查询用户 * @param username * @return */ SysUser findUserByUserName(String username); }
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.springsecurity.dao.UserMapper"> <resultMap type="com.example.springsecurity.pojo.SysUser" id="SysUserResult"> <id property="userId" column="user_id" /> <result property="deptId" column="dept_id" /> <result property="userName" column="user_name" /> <result property="nickName" column="nick_name" /> <result property="email" column="email" /> <result property="phonenumber" column="phonenumber" /> <result property="sex" column="sex" /> <result property=
-