一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
大家好,我是程序员路飞,三年的下水道打杂前端,喜欢研究技术,正在往全栈发展
欢迎小伙伴们加我微信:DZHningmeng
,一起讨论,期待与大家共同成长🥂
前言
这是Spring Boot
集成Spring Security
的第二章,我将会通过这个系列文章,包括完整的项目搭建、编码过程实现(认证和授权),关键点讲解,来帮助大家了解Spring Security
在实际项目中的应用
今天这篇内容主要是通过集成Mybatis,实现后端接口查询用户
往期系列
Spring Boot集成Spring Security系列一之搭建项目
功能实现
数据库表结构
现在大部分的项目都是采用前后端分离的架构,所以我们只需要通过实现Restful接口实现登录功能 我们这个案例使用JWT方案实现前后端的登录鉴权功能
因为我们的用户信息和权限是定义在数据库中的,我们先创建对应的表结构信息,sql过长,大家可以通过代码链接查看对应的sql
功能编码
jwt工具类
jwt工具用来生成、解析、判断是否过期等
添加依赖
<!--JWT(Json Web Token)登录支持-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
在配置文件application.yml(将application.properties文件后缀改为yml)
# 自定义jwt key
jwt:
tokenHeader: Authorization #JWT Header
secret: mySecret # JWT秘钥
expiration: 604800 # JWT过期时间(60 * 60 * 24)
JWT Token工具
@Component
public class JwtTokenUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenUtil.class);
private static final String CLAIM_KEY_USERNAME = "sub";
private static final String CLAIM_KEY_CREATED = "created";
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
/**
* 负责生成jwt的token
*/
private String generateToken(Map<String, Object> claims) {
return Jwts.builder()
.setClaims(claims) //
.setExpiration(generateExpiration()) // 设置过期时间
.signWith(SignatureAlgorithm.HS512, secret) // 加密方式
.compact();
}
/**
* 生成token的过期时间
*/
private Date generateExpiration() {
return new Date(System.currentTimeMillis() + expiration * 1000);
}
/**
* 从Token获取jwt的负载
*/
private Claims getClaimsFromToken(String token) {
Claims claims = null;
try {
claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
LOGGER.info("JWT格式验证失败, {}", token);
}
return claims;
}
/**
* 从token中获取登录用户名
*/
public String getUserNameFromToken(String token) {
String username;
try {
Claims claims = getClaimsFromToken(token);
username = claims.getSubject();
} catch (Exception e) {
username = null;
}
return username;
}
/**
* 验证token是否失效
*/
public boolean validateToken(String token, UserDetails userDetails) {
String username = getUserNameFromToken(token);
return userDetails.getUsername().equals(username) && !isTokenExpired(token);
}
/**
* token是否过期
*/
private boolean isTokenExpired(String token) {
Date expireDate = getExpireDateFromToken(token);
return expireDate.before(new Date());
}
/**
* 获取Token的过期时间
*/
private Date getExpireDateFromToken(String token) {
Claims claims = getClaimsFromToken(token);
return claims.getExpiration();
}
/**
* 根据用户信息生成token
*/
public String generateToken(UserDetails userDetails) {
HashMap<String, Object> claims = new HashMap<>();
claims.put(CLAIM_KEY_USERNAME, userDetails.getUsername());
claims.put(CLAIM_KEY_CREATED, new Date());
return generateToken(claims);
}
}
Mybatis集成
Mybatis用来处理sql语句
添加依赖
<!--MyBatis分页插件 集成了Mybatis-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
添加配置
# Mysql数据库配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/spring_security?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis配置
mybatis:
mapper-locations: # xml的位置
- classpath:mapper/*.xml
- classpath*:com/**/mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # sql日志打印
cache-enabled: true # 驼峰转换
创建User mapper包,用来编写sql语句
首先在entity
包下定义User Bean文件
package com.example.springsecurity.entity;
import lombok.Data;
@Data // 简化代码的get ,set, toString
public class User {
private Integer id;
private String username;
private String password;
}
然后在mapper
创建UserMapper
, 通过用户名查询用户
这个时候我们启动项目,发现会报以下错误,mapper包为找到
我们需要在启动类加上一个注解扫描mapper文件
启动项目登录访问接口,发现已经成功找到user的数据
🚴♀️ 结束语
通过项目实践,结合具体的步骤,输出相关的文章,给小伙伴一些有些的知识点,希望大家喜欢我的文章,希望认识到更多志同道合的伙伴
,如果你也对技术感兴趣,可以加我好友
,互相探讨
,一起进步
Github: Cheering-baby
公众号: 程序员路飞
vx: DZHningmeng
最后,如果喜欢我的文章,可以给个赞👍或者关注➕都是对我最大的支持