Spring Boot集成Spring Security系列二之查询用户

523 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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包为找到

image.png

我们需要在启动类加上一个注解扫描mapper文件

启动项目登录访问接口,发现已经成功找到user的数据

image.png

🚴‍♀️ 结束语

通过项目实践,结合具体的步骤,输出相关的文章,给小伙伴一些有些的知识点,希望大家喜欢我的文章,希望认识到更多志同道合的伙伴,如果你也对技术感兴趣,可以加我好友互相探讨一起进步

Github: Cheering-baby

公众号: 程序员路飞

vx: DZHningmeng

最后,如果喜欢我的文章,可以给个赞👍或者关注➕都是对我最大的支持