文章首发于博客:布袋青年,原文链接直达:Spring Security权限认证实战。
Talk is cheap, show me you code. 完整工程代码,GitHub仓库直达。
一、基本介绍
先通过下面这张图确定我们需实现的目标,主要分为两条主线: 登录验证
与 权限认证
。
-
登录验证
通过
JWT
为每个用户生成唯一且指定期限的Token
,每次用户请求都将会重新生成重置过期时间,当在指定时间内该用户没有进行操作时Token
将会过期。此时用户再次请求将会重定向至登录流程,至于Token
过期时间应该根据业务场景而定。顺便一提,如果需要实现
N
天免登录可以在接口额外添加一个标记用于表明用户是否勾选了N
天免登录,然后在生成Token
即可延迟过期时效。 -
权限认证
权限认证通过
Spring Security
框架实现,当用户登录之后进行资源访问,对于服务端而言即接口调用,根据用户的角色判断是否有权限进行访问,若没有则应该予以相应的提示。
二、数据准备
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
数据表中插入两条测试数据,角色分别为 USER
与 ADMIN
,其中密码是 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
之外还引入了 AES
和 JWT
相关的依赖。
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