当前位置: 首页 > news >正文

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

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

1. 数据库设计

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

  • 用户表 (Users):存储用户信息。
  • 角色表 (Roles):存储角色信息。
  • 模块表 (Modules):存储系统的功能模块。
  • 权限表 (Permissions):存储权限信息。
  • 用户角色表 (UserRoles):存储用户和角色的关系,一个用户对应一个角色。
  • 角色权限表 (RolePermissions):存储角色与权限的关系,允许不同用户的权限定制。
  • 用户权限表 (UserPermissions):为每个用户定制权限(可覆盖角色权限)。
表结构
-- 用户表
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. 查询该用户是否有自定义权限。
示例查询
-- 查询用户的角色
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# 代码实现

获取用户权限
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.RoleIdFROM Users uJOIN UserRoles ur ON u.UserId = ur.UserIdJOIN Roles r ON ur.RoleId = r.RoleIdWHERE u.UserId = @UserId";SqlCommand roleCommand = new SqlCommand(roleQuery, connection);roleCommand.Parameters.AddWithValue("@UserId", userId);int roleId = (int)roleCommand.ExecuteScalar();// 获取角色权限string rolePermissionQuery = @"SELECT p.PermissionNameFROM RolePermissions rpJOIN Permissions p ON rp.PermissionId = p.PermissionIdWHERE 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.PermissionNameFROM UserPermissions upJOIN Permissions p ON up.PermissionId = p.PermissionIdWHERE 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 表为用户定制权限,覆盖角色的默认权限。
  • 灵活的权限控制:用户的权限不仅继承自角色,还可以根据需要定制,确保权限控制的灵活性。

相关文章:

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

将权限信息存储在数据库中&#xff0c;支持动态调整。根据用户所属的角色、特定的功能模块&#xff0c;动态加载权限” 1. 数据库设计 根据这种需求&#xff0c;可以通过以下表设计&#xff1a; 用户表 (Users)&#xff1a;存储用户信息。角色表 (Roles)&#xff1a;存储角色…...

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio&#xff0c;发现整个界面都发生了很大改动&#xff1a; 新的界面的一些设置可参考一些博客&#xff1a; Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说&#xff0c;没有时间去适应&#xff0c;那么怎么办呢&am…...

Ubuntu24虚拟机-gnome-boxes

推荐使用gnome-boxes&#xff0c; virtualbox构建失败&#xff0c;multipass需要开启防火墙 sudo apt install gnome-boxes创建完毕&#xff5e;...

k8s rainbond centos7/win10 -20241124

参考 https://www.rainbond.com/ 国内一站式云原生平台 对centos7环境支持不太行 [lighthouseVM-16-5-centos ~]$ curl -o install.sh https://get.rainbond.com && bash ./install.sh 2024-11-24 09:56:57 ERROR: Ops! Docker daemon is not running. Start docke…...

SpringBoot+Vue滑雪社区网站设计与实现

【1】系统介绍 研究背景 随着互联网技术的快速发展和冰雪运动的普及&#xff0c;滑雪作为一种受欢迎的冬季运动项目&#xff0c;吸引了越来越多的爱好者。与此同时&#xff0c;社交媒体和在线社区平台的兴起为滑雪爱好者提供了一个交流经验、分享心得、获取信息的重要渠道。滑…...

MySql.2

sql查询语句执行过程 SQL 查询语句的执行过程是一个复杂的过程&#xff0c;涉及多个步骤。以下是典型的关系数据库管理系统 (RDBMS) 中 SQL 查询语句的执行过程概述&#xff1a; 1. ‌客户端发送查询‌ 用户通过 SQL 客户端或应用程序发送 SQL 查询语句给数据库服务器。 2. ‌…...

算法之区间和题目讲解

题干 难度&#xff1a;简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而&#xff0c;区间在输入的最下面&#xff0c;所以按照暴力破解的思路&#xff0c;我们首先要遍历数组&#xff0c;把它的值都存进去。 然后&#xff0c;遍历下面的区间&#xff0c;从索引a…...

价格分类(神经网络)

# 1.导入依赖包 import timeimport torch import torch.nn as nn import torch.optim as optimfrom torch.utils.data import TensorDataset, DataLoader from sklearn.model_selection import train_test_splitimport numpy as np import pandas as pd import matplotlib.pypl…...

对智能电视直播App的恶意监控

首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者&#xff0c;这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团&#xff0c;阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...

【JavaEE初阶】多线程初阶下部

文章目录 前言一、volatile关键字volatile 能保证内存可见性 二、wait 和 notify2.1 wait()方法2.2 notify()方法2.3 notifyAll()方法2.4 wait 和 sleep 的对比&#xff08;面试题&#xff09; 三、多线程案例单例模式 四、总结-保证线程安全的思路五、对比线程和进程总结 前言…...

macOS上进行Ant Design Pro实战教程(一)

由于一个AI项目的前端使用了umi&#xff0c;本教程根据阿里官网上的 《Ant Design 实战教程&#xff08;beta 版&#xff09;》来实操一下&#xff0c;我使用macOS操作系统&#xff0c;VS Code 开发环境。 一、开发环境 1、安装nodejs, npm, yarn 官网上建议使用cnpm&#xf…...

智能合约运行原理

点个关注吧&#xff01;&#xff01; 用一句话来总结&#xff0c;智能合约就像是一个自动售货机&#xff1a;你投入硬币&#xff08;触发条件&#xff09;&#xff0c;选择商品&#xff08;执行合约&#xff09;&#xff0c;然后机器就会自动给你商品&#xff08;执行结果&…...

安卓动态添加View

在安卓应用中&#xff0c;有很多时候需要动态添加View。比如从后台获取商品列表&#xff0c;根据商品数量在页面渲染对应数量的条目&#xff0c;这时候就需要动态添加View。 1.动态添加View的方法 动态添加View有两种方法&#xff1a; 由代码生成子View&#xff1a;这种方式…...

前端预览pdf文件流

需求 后端接口返回pdf文件流&#xff0c;实现新窗口预览pdf。 解决方案 把后端返回的pdf文件流转为blob路径&#xff0c;利用浏览器直接预览。 具体实现步骤 1、引入axios import axios from axios;2、创建预览方法&#xff08;具体使用时将axios的请求路径替换为你的后端…...

【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!

一、前言 Apache JMeter是纯Java的开源软件&#xff0c;最初由Apache软件基金会的Stefano Mazzocchi开发&#xff0c;旨在加载测试功能行为和测量性能。可以使用JMeter进行性能测试&#xff0c;即针对重负载、多用户和并发流量测试Web应用程序。 我们选择JMeter原因 是否测试过…...

【zookeeper03】消息队列与微服务之zookeeper集群部署

ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点&#xff0c;处于次要地位主要负责处理读操作的主机称为 follower 节点…...

从 Llama 1 到 3.1:Llama 模型架构演进详解

编者按&#xff1a; 面对 Llama 模型家族的持续更新&#xff0c;您是否想要了解它们之间的关键区别和实际性能表现&#xff1f;本文将探讨 Llama 系列模型的架构演变&#xff0c;梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程&#xff0c;深入剖析了每个版本的技术创新&#…...

UE5肉鸽游戏教程学习

学习地址推荐&#xff1a;UE5肉鸽项目实战教程_哔哩哔哩_bilibili...

Vue3 - 详细实现虚拟列表前端虚拟滚动列表解决方案,vue3长列表优化之虚拟列表,解决列表动态高度不固定高度及图片视频图文异步请求加载问题,虚拟列表DOM大量数据同时加载渲染卡顿太慢及下滑列表闪烁

前言 Vue2 版本,请访问 这篇文章 在 vue3 项目开发中,详解实现虚拟列表高度不固定(不定高)且复杂含有图片视频等复杂虚拟列表教程,决列表每项高度不确定及img图像或视频的加载方案,利用缓冲区技术解决用户浏览时渲染不及时列表闪烁白屏/列表加载闪屏,解vue3实现虚拟列表优…...

英语知识网站开发:Spring Boot框架技巧

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了英语知识应用网站的开发全过程。通过分析英语知识应用网站管理的不足&#xff0c;创建了一个计算机管理英语知识应用网站的方案。文章介绍了英语知识应用网站的系…...

Windows系统mqoa.dll文件丢失无法启动程序解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…...

加州自动驾驶测试报告解读:数据背后的技术演进与行业趋势

1. 从加州数据看自动驾驶的“成绩单”&#xff1a;2021年测试报告深度解读每年年初&#xff0c;自动驾驶圈子里不少人都会习惯性地去翻看一份来自美国加州的“成绩单”——加州机动车辆管理局发布的年度自动驾驶车辆测试报告。这份报告就像一份公开的“期中考试”排名&#xff…...

服务器运维与DevOps融合:迈向智能化运维的新纪元

在数字化浪潮席卷全球的今天&#xff0c;企业对IT基础设施的依赖程度日益加深&#xff0c;服务器运维作为支撑业务连续性和系统稳定性的核心环节&#xff0c;正面临前所未有的挑战与机遇。传统运维模式依赖人工干预、响应滞后、效率低下&#xff0c;已难以满足现代业务快速迭代…...

AC鸭的迷宫按钮

题目描述AC鸭来到一个迷宫里&#xff0c;迷宫有 n 行 m 列。迷宫中有五种字符&#xff1a;A 表示 AC鸭一开始的位置。B 表示出口的位置。. 表示可以经过的空地。# 表示一开始不能经过的墙。K 表示按钮。AC鸭每一步可以向上、下、左、右四个方向移动一格&#xff0c;不能走出迷宫…...

让机房管理告别粗放,每一寸资源都物尽其用

对于机房运维人员而言&#xff0c;U 位管理看似是基础小事&#xff0c;却是决定机房运维效率、资产安全与合规水平的关键。当前&#xff0c;不少企业机房、单位机房仍沿用传统人工管理模式&#xff0c;机柜 U 位全靠记忆、台账全靠 Excel、盘点全靠熬夜&#xff0c;看似节省了成…...

从仿真到论文图表:手把手教你用FDTD参数扫描和Matlab处理WO3薄膜光学数据

从仿真到论文图表&#xff1a;FDTD参数扫描与Matlab数据可视化全流程解析 在光电材料研究中&#xff0c;WO₃薄膜因其优异的电致变色特性备受关注。当我们需要系统研究薄膜厚度对光学性能的影响时&#xff0c;FDTD Solutions的参数扫描功能配合Matlab的数据处理能力&#xff0c…...

【仅限首批Early Access用户】Claude 3.5 Sonnet的“动态温度调节”机制详解:如何让模型在严谨性与创意性间智能切换?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Claude 3.5 Sonnet新功能详解 Anthropic 正式发布的 Claude 3.5 Sonnet 在推理速度、多模态理解与工具调用能力上实现显著跃升&#xff0c;尤其在代码生成与结构化输出方面表现突出。该模型原生支持 JS…...

CompressO终极指南:免费开源视频图片压缩工具完整使用教程

CompressO终极指南&#xff1a;免费开源视频图片压缩工具完整使用教程 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compres…...

Mac小白必看:手把手教你找回丢失的Recovery HD分区(附diskutil命令详解)

Mac用户必备技能&#xff1a;深度解析Recovery HD分区修复与diskutil实战指南 当你按下CommandR却只看到闪烁的问号图标时&#xff0c;那种手足无措的感觉我深有体会。Recovery HD分区就像是Mac的急救箱&#xff0c;藏着系统恢复、磁盘修复和时间机器备份等关键工具。但很多用户…...

Apache Airflow 系列教程 | 第30课:Deadline 与 SLA 管理

导读(Introduction) 在生产环境中运行的数据管道,"按时完成"往往和"正确完成"同样重要。当一个关键的每日报表管道必须在早上 8 点前完成,或者当一个下游系统依赖的数据必须在特定时间窗口内准备就绪时,仅仅依靠"失败后告警"是不够的——我…...