引言
Spring Security
是一个功能强大且高度可定制的身份验证和访问控制的框架,提供了完善的认证机制和方法级的授权功能,是一个非常优秀的权限管理框架。其核心是一组过滤器链,不同的功能经由不同的过滤器。本文将通过一个案例将 Spring Security
整合到 SpringBoot
中,要实现的功能就是在认证服务器上登录,然后获取Token,再访问资源服务器中的资源。
一、基本介绍
登录验证:
通过 JWT
为每个用户生成一个唯一且有期限的 Token
,用户每次请求都会重新生成过期时间,在规定的时间内,用户未进行操作 Token
就会过期,当用户再次请求时则会再次执行登录流程,而 Token
的过期时间应根据实际的业务场景规定。
权限认证:
权限认证通过Spring Security
框架来实现,在用户成功登录之后,当尝试访问系统资源时(即发起接口调用),服务端会根据用户所属的角色来判断其是否具备相应的访问权限。若用户未获得该资源的访问权限,则服务端应当返回明确的权限不足提示信息,以确保系统的安全性与用户体验。
通过如图来讲解我们的实现目标:登录验证
和 权限认证
二、环境准备
创建 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;
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.为项目导入相关依赖
在pom.xml
文件中到入依赖,除了 Security
之外 还引入了 AES
和 JWT
相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- AES加密 -->
<dependency>
<groupId>org.apache.directory.studio</groupId>
<artifactId>org.apache.commons.codec</artifactId>
<version>1.8</version>
</dependency>
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
</dependencies>
创建项目所需实体类:
在工程中创建一个新的实体类AuthUser
,该实体类需要实现Spring Security
的UserDetails
接口,并特别地,需要重写getAuthorities()
方法来从数据库中动态读取并设置用户的角色权限。此外,为了确保用户账户处于正常激活状态,isAccountNonExpired()
、isAccountNonLocked()
、isCredentialsNonExpired()
、isEnabled()
这四个方法也必须被重写,并且应该基于数据库查询的结果或业务逻辑,无条件地返回true(假设在这个场景下,所有用户账户都被视为有效、未过期、未锁定且凭据未过期)。
这样的设计确保了AuthUser
类能够准确地反映用户的安全状态和权限信息,同时允许Spring Security
框架利用这些信息进行访问控制。通过从数据库动态加载权限信息,系统能够灵活地适应不同用户的权限需求,提升系统的安全性和灵活性。
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 credentialsN