在 Spring Boot 3 中实现基于角色的访问控制
基于角色的访问控制 (RBAC) 是一种有价值的访问控制模型,可增强安全性、简化访问管理并提高效率。它在管理资源访问对安全和运营至关重要的复杂环境中尤其有益。
我们将做什么
我们有一个包含公共路由和受限路由的 Web API。受限路由需要数据库中用户的有效 JWT。
现在用户已经通过身份验证,我们希望更进一步,只有当用户具有特定角色时才允许访问某些数据。
我们的系统中有以下角色:
- 用户:可以访问他的信息
- 管理员:可以执行用户角色所做的所有操作并访问用户列表。
- 超级管理员:可以执行管理员角色所做的所有操作,并可以创建管理员用户;简而言之,他可以做所有事情。
以下是受保护路由列表以及访问它们所需的角色
Route: [ GET] /users/me
角色:用户、管理员、超级管理员
描述:检索经过身份验证的用户。
Route: [GET] /users
角色:管理员、超级管理员
描述:检索所有用户的列表。
Route: [POST] /admins
角色:超级管理员
描述:创建管理员。
前提条件:
要遵循本教程,请确保您的计算机上安装了以下工具。
- JDK 11 或更高版本
- Maven 3.8 或更高版本
- Docker
我们需要 Docker 来运行 MySQL 8 的容器;如果你的计算机上安装了 MySQL,则可以跳过它。运行以下命令从MySQL 映像启动 Docker 容器:
docker run -d -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=taskdb --name mysqldb -p 3307:3306 mysql:8.0
让我们使用以下 cURL 请求来注册一个用户。
我们得到以下输出。
我们可以看到一切都按预期进行;让我们继续!
创建角色实体
角色实体将代表我们系统中所需的不同角色。我们将创建一个枚举来表示所有可能的角色名称。
在“entities”包中,创建文件“RoleEnum.java”并添加以下代码:
package com.tericcabrel.authapi.entities;
public enum RoleEnum {
USER,
ADMIN,
SUPER_ADMIN
}
在“entities”包中,创建一个文件“Role.java”并添加以下代码:
package com.tericcabrel.authapi.entities;
import jakarta.persistence.*;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import java.util.Date;
@Table(name = "roles")
@Entity
public class Role {
@Id
&#