C#+数据库 实现动态权限设置

将权限信息存储在数据库中,支持动态调整。根据用户所属的角色、特定的功能模块,动态加载权限"

1. 数据库设计

根据这种需求,可以通过以下表设计:

  • 用户表 (Users):存储用户信息。
  • 角色表 (Roles):存储角色信息。
  • 模块表 (Modules):存储系统的功能模块。
  • 权限表 (Permissions):存储权限信息。
  • 用户角色表 (UserRoles):存储用户和角色的关系,一个用户对应一个角色。
  • 角色权限表 (RolePermissions):存储角色与权限的关系,允许不同用户的权限定制。
  • 用户权限表 (UserPermissions):为每个用户定制权限(可覆盖角色权限)。
表结构
sql 复制代码
-- 用户表
CREATE TABLE Users (
    UserId INT PRIMARY KEY,
    UserName VARCHAR(100)
);

-- 角色表
CREATE TABLE Roles (
    RoleId INT PRIMARY KEY,
    RoleName VARCHAR(100)
);

-- 模块表
CREATE TABLE Modules (
    ModuleId INT PRIMARY KEY,
    ModuleName VARCHAR(100)
);

-- 权限表
CREATE TABLE Permissions (
    PermissionId INT PRIMARY KEY,
    PermissionName VARCHAR(100)
);

-- 用户角色表:每个用户对应一个角色
CREATE TABLE UserRoles (
    UserId INT,
    RoleId INT,
    FOREIGN KEY (UserId) REFERENCES Users(UserId),
    FOREIGN KEY (RoleId) REFERENCES Roles(RoleId)
);

-- 角色权限表:角色与权限的关系,一个角色可以有多个权限
CREATE TABLE RolePermissions (
    RoleId INT,
    PermissionId INT,
    ModuleId INT,
    FOREIGN KEY (RoleId) REFERENCES Roles(RoleId),
    FOREIGN KEY (PermissionId) REFERENCES Permissions(PermissionId),
    FOREIGN KEY (ModuleId) REFERENCES Modules(ModuleId)
);

-- 用户权限表:为用户定制权限,覆盖角色权限
CREATE TABLE UserPermissions (
    UserId INT,
    PermissionId INT,
    ModuleId INT,
    FOREIGN KEY (UserId) REFERENCES Users(UserId),
    FOREIGN KEY (PermissionId) REFERENCES Permissions(PermissionId),
    FOREIGN KEY (ModuleId) REFERENCES Modules(ModuleId)
);

2. 权限加载逻辑

  1. 用户角色 :每个用户通过 UserRoles 表与一个角色关联。
  2. 角色权限 :通过 RolePermissions 表为角色分配权限。
  3. 用户权限 :通过 UserPermissions 表为用户定制权限,覆盖角色的默认权限。

3. 权限查询

  • 查询用户权限 :首先通过 UserRoles 获取该用户的角色,再通过 RolePermissions 查询该角色的权限。然后,如果该用户有自定义权限,可以通过 UserPermissions 覆盖角色权限。
查询用户权限的顺序
  1. 查询用户所属角色。
  2. 查询该角色的权限。
  3. 查询该用户是否有自定义权限。
示例查询
sql 复制代码
-- 查询用户的角色
SELECT r.RoleId, r.RoleName
FROM Users u
JOIN UserRoles ur ON u.UserId = ur.UserId
JOIN Roles r ON ur.RoleId = r.RoleId
WHERE u.UserId = @UserId;

-- 查询角色的权限
SELECT p.PermissionName
FROM RolePermissions rp
JOIN Permissions p ON rp.PermissionId = p.PermissionId
WHERE rp.RoleId = @RoleId AND rp.ModuleId = @ModuleId;

-- 查询用户的自定义权限(如果有)
SELECT p.PermissionName
FROM UserPermissions up
JOIN Permissions p ON up.PermissionId = p.PermissionId
WHERE up.UserId = @UserId AND up.ModuleId = @ModuleId;

4. C# 代码实现

获取用户权限
csharp 复制代码
public class PermissionService
{
    private string connectionString = "your_connection_string";

    // 获取用户权限
    public List<string> GetPermissionsByUserId(int userId, int moduleId)
    {
        List<string> permissions = new List<string>();

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            // 获取用户角色
            string roleQuery = @"
                SELECT r.RoleId
                FROM Users u
                JOIN UserRoles ur ON u.UserId = ur.UserId
                JOIN Roles r ON ur.RoleId = r.RoleId
                WHERE u.UserId = @UserId";
            SqlCommand roleCommand = new SqlCommand(roleQuery, connection);
            roleCommand.Parameters.AddWithValue("@UserId", userId);
            int roleId = (int)roleCommand.ExecuteScalar();

            // 获取角色权限
            string rolePermissionQuery = @"
                SELECT p.PermissionName
                FROM RolePermissions rp
                JOIN Permissions p ON rp.PermissionId = p.PermissionId
                WHERE rp.RoleId = @RoleId AND rp.ModuleId = @ModuleId";
            SqlCommand rolePermissionCommand = new SqlCommand(rolePermissionQuery, connection);
            rolePermissionCommand.Parameters.AddWithValue("@RoleId", roleId);
            rolePermissionCommand.Parameters.AddWithValue("@ModuleId", moduleId);

            SqlDataReader reader = rolePermissionCommand.ExecuteReader();
            while (reader.Read())
            {
                permissions.Add(reader.GetString(0));  // 角色权限
            }

            reader.Close();

            // 获取用户自定义权限(如果有)
            string userPermissionQuery = @"
                SELECT p.PermissionName
                FROM UserPermissions up
                JOIN Permissions p ON up.PermissionId = p.PermissionId
                WHERE up.UserId = @UserId AND up.ModuleId = @ModuleId";
            SqlCommand userPermissionCommand = new SqlCommand(userPermissionQuery, connection);
            userPermissionCommand.Parameters.AddWithValue("@UserId", userId);
            userPermissionCommand.Parameters.AddWithValue("@ModuleId", moduleId);

            SqlDataReader userReader = userPermissionCommand.ExecuteReader();
            while (userReader.Read())
            {
                permissions.Add(userReader.GetString(0));  // 用户自定义权限
            }
        }

        return permissions;
    }
}

public class AccessControlService
{
    private PermissionService permissionService = new PermissionService();

    // 检查用户是否有权限
    public bool CanAccessModule(int userId, int moduleId, string requiredPermission)
    {
        List<string> permissions = permissionService.GetPermissionsByUserId(userId, moduleId);

        return permissions.Contains(requiredPermission);  // 判断用户是否拥有特定权限
    }
}

5. 总结

  • 用户与角色的关系:一个用户对应一个角色,多个用户可以对应相同角色。
  • 角色与权限的关系 :角色通过 RolePermissions 表分配权限,一个角色可以对应多个权限。
  • 用户自定义权限 :通过 UserPermissions 表为用户定制权限,覆盖角色的默认权限。
  • 灵活的权限控制:用户的权限不仅继承自角色,还可以根据需要定制,确保权限控制的灵活性。
相关推荐
David猪大卫12 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
这个DBA有点耶13 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风13 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
用户37215742613513 小时前
C# 实现 Excel 单元格保护:锁定公式并允许编辑指定区域
c#·ai编程·编程语言
Alluxio13 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
fengci.14 小时前
CTF2MISC中等部分
开发语言·前端·学习
xys_67815 小时前
JavaEE通关手册:初识Java
java·开发语言
ShineWinsu16 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
数据库急诊室_阿哲17 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
ShineWinsu17 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem