04-权限管理表结构设计
...大约 3 分钟Java
设计一个权限管理系统的表结构需要考虑以下几个主要实体:用户、角色、权限以及它们之间的关系。以下是一个常见的权限管理系统表结构的设计:
表结构设计
用户表 (users): 存储用户信息。
CREATE TABLE users ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, email VARCHAR(100) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
角色表 (roles): 存储角色信息。
CREATE TABLE roles ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL UNIQUE, description VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
权限表 (permissions): 存储权限信息。
CREATE TABLE permissions ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL UNIQUE, description VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
用户角色表 (user_roles): 存储用户和角色之间的多对多关系。
CREATE TABLE user_roles ( user_id BIGINT NOT NULL, role_id BIGINT NOT NULL, PRIMARY KEY (user_id, role_id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE );
角色权限表 (role_permissions): 存储角色和权限之间的多对多关系。
CREATE TABLE role_permissions ( role_id BIGINT NOT NULL, permission_id BIGINT NOT NULL, PRIMARY KEY (role_id, permission_id), FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE, FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE );
关系说明
用户 (users):
- 存储用户的基本信息,如用户名、密码、电子邮件等。
角色 (roles):
- 存储角色的基本信息,如角色名称和描述。
权限 (permissions):
- 存储权限的基本信息,如权限名称和描述。
用户角色 (user_roles):
- 实现用户与角色之间的多对多关系。一个用户可以有多个角色,一个角色可以分配给多个用户。
角色权限 (role_permissions):
- 实现角色与权限之间的多对多关系。一个角色可以有多个权限,一个权限可以分配给多个角色。
数据库设计示意图
users roles permissions
------ ------ ------------
id (PK) id (PK) id (PK)
username name name
password description description
email created_at created_at
created_at updated_at updated_at
updated_at
user_roles
-----------
user_id (PK, FK)
role_id (PK, FK)
role_permissions
----------------
role_id (PK, FK)
permission_id (PK, FK)
示例数据
users 表:
id | username | password | created_at | updated_at | |
---|---|---|---|---|---|
1 | john | pass_hash1 | john@example.com | 2022-01-01 12:00:00 | 2022-01-01 12:00:00 |
2 | jane | pass_hash2 | jane@example.com | 2022-01-02 12:00:00 | 2022-01-02 12:00:00 |
roles 表:
id | name | description | created_at | updated_at |
---|---|---|---|---|
1 | Admin | Administrator role | 2022-01-01 12:00:00 | 2022-01-01 12:00:00 |
2 | User | Regular user role | 2022-01-02 12:00:00 | 2022-01-02 12:00:00 |
permissions 表:
id | name | description | created_at | updated_at |
---|---|---|---|---|
1 | READ_PRIVILEGE | Read access | 2022-01-01 12:00:00 | 2022-01-01 12:00:00 |
2 | WRITE_PRIVILEGE | Write access | 2022-01-02 12:00:00 | 2022-01-02 12:00:00 |
user_roles 表:
user_id | role_id |
---|---|
1 | 1 |
2 | 2 |
role_permissions 表:
role_id | permission_id |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
业务逻辑示例
- 用户分配角色:
- 当一个用户(如
john
)被分配为管理员角色时,在user_roles
表中插入一条记录user_id=1, role_id=1
。
- 当一个用户(如
- 角色分配权限:
- 当管理员角色具有读取和写入权限时,在
role_permissions
表中插入两条记录:role_id=1, permission_id=1
和role_id=1, permission_id=2
。
- 当管理员角色具有读取和写入权限时,在
具体实现
假设使用 Spring Boot 和 JPA:
User 实体类:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String email;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles = new HashSet<>();
}
Role 实体类:
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String description;
@ManyToMany(mappedBy = "roles")
private Set<User> users = new HashSet<>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "role_permissions",
joinColumns = @JoinColumn(name = "role_id"),
inverseJoinColumns = @JoinColumn(name = "permission_id")
)
private Set<Permission> permissions = new HashSet<>();
}
Permission 实体类:
@Entity
public class Permission {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String description;
@ManyToMany(mappedBy = "permissions")
private Set<Role> roles = new HashSet<>();
}
通过这种表结构设计和 JPA 实体映射,你可以有效地管理用户、角色和权限,并实现复杂的权限控制逻辑。
Powered by Waline v3.2.0