保姆级教程,Spring Boot接入Security权限认证服务

2023年 8月 21日 73.0k 0

文章首发于博客:布袋青年,原文链接直达:Spring Security权限认证实战。

Talk is cheap, show me you code. 完整工程代码,GitHub仓库直达。

一、基本介绍

先通过下面这张图确定我们需实现的目标,主要分为两条主线: 登录验证权限认证

  • 登录验证

    通过 JWT 为每个用户生成唯一且指定期限的 Token ,每次用户请求都将会重新生成重置过期时间,当在指定时间内该用户没有进行操作时 Token 将会过期。此时用户再次请求将会重定向至登录流程,至于 Token 过期时间应该根据业务场景而定。

    顺便一提,如果需要实现 N 天免登录可以在接口额外添加一个标记用于表明用户是否勾选了 N 天免登录,然后在生成 Token 即可延迟过期时效。

  • 权限认证

    权限认证通过 Spring Security 框架实现,当用户登录之后进行资源访问,对于服务端而言即接口调用,根据用户的角色判断是否有权限进行访问,若没有则应该予以相应的提示。

image.png

二、数据准备

1 Table

新建角色用户数据表 auth_user,用户存储用户的角色详情,建表语句如下:

CREATE TABLE `auth_user`
(
    `id`                      varchar(36) NOT NULL,
    `username`                varchar(100) DEFAULT NULL,
    `password`                varchar(100) DEFAULT NULL,
    `role`                    varchar(100) DEFAULT NULL,
    `account_non_expired`     int(11) DEFAULT '0',
    `account_non_locked`      int(11) DEFAULT '0',
    `credentials_non_expired` int(11) DEFAULT '0',
    `is_enabled`              int(11) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

2. 测试数据

在新建的 auth_user 数据表中插入两条测试数据,角色分别为 USERADMIN ,其中密码是 AES 加密后的数据,其对应的明文为: 123

INSERT INTO auth_user (id, username, password, `role`, account_non_expired, account_non_locked,
                       credentials_non_expired, is_enabled)
VALUES ('1', 'user', '15tT+y0b+lJq2HIKUjsvvg==', 'USER', 1, 1, 1, 1),
       ('2', 'admin', '15tT+y0b+lJq2HIKUjsvvg==', 'ADMIN', 1, 1, 1, 1);

三、登录实现

1. 工程依赖

Maven 工程中引入下列依赖,除了 Security 之外还引入了 AESJWT 相关的依赖。


    
        org.springframework.boot
        spring-boot-starter-security
    
    
    
        org.apache.directory.studio
        org.apache.commons.codec
        1.8
    
    
    
        io.jsonwebtoken
        jjwt
        0.9.0
    

2. 实体类

在工程中新建实体类 AuthUser,需要实现 UserDetails 类并重写其 getAuthorities() 方法读取数据库中配置的角色权限。

还有一个非常重要的点是一定要重写 isAccountNonExpired()isAccountNonLocked()isCredentialsNonExpired()isEnabled() 四个方法且返回 true ,这样角色才处于正常激活状态,这里我配置的是读取数据库查询出来的结果。

public class AuthUser implements Serializable, UserDetails {

private static final long serialVersionUID = 1L;

private String id;

private String username;

private String password;

private String role;

private Integer accountNonExpired;

private Integer accountNonLocked;

private Integer credentialsNonExpired;

private Integer isEnabled;

@Override
public Collection

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论