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. 权限加载逻辑
- 用户角色:每个用户通过
UserRoles表与一个角色关联。 - 角色权限:通过
RolePermissions表为角色分配权限。 - 用户权限:通过
UserPermissions表为用户定制权限,覆盖角色的默认权限。
3. 权限查询
- 查询用户权限:首先通过
UserRoles获取该用户的角色,再通过RolePermissions查询该角色的权限。然后,如果该用户有自定义权限,可以通过UserPermissions覆盖角色权限。
查询用户权限的顺序
- 查询用户所属角色。
- 查询该角色的权限。
- 查询该用户是否有自定义权限。
示例查询
-- 查询用户的角色
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#+数据库 实现动态权限设置
将权限信息存储在数据库中,支持动态调整。根据用户所属的角色、特定的功能模块,动态加载权限” 1. 数据库设计 根据这种需求,可以通过以下表设计: 用户表 (Users):存储用户信息。角色表 (Roles):存储角色…...
(原创)Android Studio新老界面UI切换及老版本下载地址
前言 这两天下载了一个新版的Android Studio,发现整个界面都发生了很大改动: 新的界面的一些设置可参考一些博客: Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说,没有时间去适应,那么怎么办呢&am…...
Ubuntu24虚拟机-gnome-boxes
推荐使用gnome-boxes, virtualbox构建失败,multipass需要开启防火墙 sudo apt install gnome-boxes创建完毕~...
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】系统介绍 研究背景 随着互联网技术的快速发展和冰雪运动的普及,滑雪作为一种受欢迎的冬季运动项目,吸引了越来越多的爱好者。与此同时,社交媒体和在线社区平台的兴起为滑雪爱好者提供了一个交流经验、分享心得、获取信息的重要渠道。滑…...
MySql.2
sql查询语句执行过程 SQL 查询语句的执行过程是一个复杂的过程,涉及多个步骤。以下是典型的关系数据库管理系统 (RDBMS) 中 SQL 查询语句的执行过程概述: 1. 客户端发送查询 用户通过 SQL 客户端或应用程序发送 SQL 查询语句给数据库服务器。 2. …...
算法之区间和题目讲解
题干 难度:简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而,区间在输入的最下面,所以按照暴力破解的思路,我们首先要遍历数组,把它的值都存进去。 然后,遍历下面的区间,从索引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的恶意监控
首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者,这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团,阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...
【JavaEE初阶】多线程初阶下部
文章目录 前言一、volatile关键字volatile 能保证内存可见性 二、wait 和 notify2.1 wait()方法2.2 notify()方法2.3 notifyAll()方法2.4 wait 和 sleep 的对比(面试题) 三、多线程案例单例模式 四、总结-保证线程安全的思路五、对比线程和进程总结 前言…...
macOS上进行Ant Design Pro实战教程(一)
由于一个AI项目的前端使用了umi,本教程根据阿里官网上的 《Ant Design 实战教程(beta 版)》来实操一下,我使用macOS操作系统,VS Code 开发环境。 一、开发环境 1、安装nodejs, npm, yarn 官网上建议使用cnpm…...
智能合约运行原理
点个关注吧!! 用一句话来总结,智能合约就像是一个自动售货机:你投入硬币(触发条件),选择商品(执行合约),然后机器就会自动给你商品(执行结果&…...
安卓动态添加View
在安卓应用中,有很多时候需要动态添加View。比如从后台获取商品列表,根据商品数量在页面渲染对应数量的条目,这时候就需要动态添加View。 1.动态添加View的方法 动态添加View有两种方法: 由代码生成子View:这种方式…...
前端预览pdf文件流
需求 后端接口返回pdf文件流,实现新窗口预览pdf。 解决方案 把后端返回的pdf文件流转为blob路径,利用浏览器直接预览。 具体实现步骤 1、引入axios import axios from axios;2、创建预览方法(具体使用时将axios的请求路径替换为你的后端…...
【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!
一、前言 Apache JMeter是纯Java的开源软件,最初由Apache软件基金会的Stefano Mazzocchi开发,旨在加载测试功能行为和测量性能。可以使用JMeter进行性能测试,即针对重负载、多用户和并发流量测试Web应用程序。 我们选择JMeter原因 是否测试过…...
【zookeeper03】消息队列与微服务之zookeeper集群部署
ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点,处于次要地位主要负责处理读操作的主机称为 follower 节点…...
从 Llama 1 到 3.1:Llama 模型架构演进详解
编者按: 面对 Llama 模型家族的持续更新,您是否想要了解它们之间的关键区别和实际性能表现?本文将探讨 Llama 系列模型的架构演变,梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程,深入剖析了每个版本的技术创新&#…...
UE5肉鸽游戏教程学习
学习地址推荐:UE5肉鸽项目实战教程_哔哩哔哩_bilibili...
Vue3 - 详细实现虚拟列表前端虚拟滚动列表解决方案,vue3长列表优化之虚拟列表,解决列表动态高度不固定高度及图片视频图文异步请求加载问题,虚拟列表DOM大量数据同时加载渲染卡顿太慢及下滑列表闪烁
前言 Vue2 版本,请访问 这篇文章 在 vue3 项目开发中,详解实现虚拟列表高度不固定(不定高)且复杂含有图片视频等复杂虚拟列表教程,决列表每项高度不确定及img图像或视频的加载方案,利用缓冲区技术解决用户浏览时渲染不及时列表闪烁白屏/列表加载闪屏,解vue3实现虚拟列表优…...
英语知识网站开发:Spring Boot框架技巧
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了英语知识应用网站的开发全过程。通过分析英语知识应用网站管理的不足,创建了一个计算机管理英语知识应用网站的方案。文章介绍了英语知识应用网站的系…...
5步掌握Betaflight 2025升级:从配置到飞行的完整解决方案
5步掌握Betaflight 2025升级:从配置到飞行的完整解决方案 【免费下载链接】betaflight Open Source Flight Controller Firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight 还在为穿越机飞行抖动和信号不稳定而烦恼吗?Betaflight …...
如何用Layerdivider在3步内将单张图片智能分层为PSD文件
如何用Layerdivider在3步内将单张图片智能分层为PSD文件 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾面对一张精美的插画,想要修改…...
别再死记公式了!用Python+LTspice快速搞定LC滤波器设计(附仿真文件)
用PythonLTspice实现LC滤波器设计的工程化实践 在传统电子工程教学中,LC滤波器设计往往陷入繁琐的公式推导和手工计算泥潭。当学生终于理解完所有理论公式,准备动手实践时,却发现自己被复杂的参数计算和反复的电路调试所困扰。这种理论与实践…...
UI-TARS-Desktop 深度解析 —— 字节开源多模态 GUI 智能体的技术与应用
“用自然语言控制电脑” 曾是科幻电影中的场景,如今正通过多模态 AI 智能体成为现实。字节跳动开源的 UI-TARS-Desktop 项目,凭借其强大的 GUI 交互能力,让 AI 能够像真人一样操作电脑桌面、浏览器与应用程序。用户只需输入 “帮我打开浏览器…...
青岛银行员工才艺大赛|iPad评委打分系统案例
在青岛银行首届员工才艺大赛现场,熹乐互动的iPad评委打分系统为这场精彩赛事注入了高效、透明的科技体验。评委们只需通过iPad端操作,即可快速为节目打分,系统实时同步数据至大屏,自动完成分数统计、加权计算与排名更新。无需人工…...
解码Voron 2.4:开源高速CoreXY 3D打印机的架构哲学与工程实践
解码Voron 2.4:开源高速CoreXY 3D打印机的架构哲学与工程实践 【免费下载链接】Voron-2 Voron 2 CoreXY 3D Printer design 项目地址: https://gitcode.com/gh_mirrors/vo/Voron-2 Voron 2.4作为开源3D打印机领域的标杆产品,代表了CoreXY架构在高…...
别再乱配了!SpringBoot配置文件加载顺序的实战避坑指南(附优先级图解)
SpringBoot配置加载优先级深度解析:从原理到实战避坑 SpringBoot的配置加载机制看似简单,实则暗藏玄机。许多开发者在使用过程中都曾遇到过配置不生效、覆盖关系混乱的问题,尤其是在多环境部署或使用外部配置时。本文将深入剖析SpringBoot配置…...
5分钟解锁B站视频解析:用开源工具实现自由播放的终极方案
5分钟解锁B站视频解析:用开源工具实现自由播放的终极方案 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你知道吗?每次你在B站观看视频时,背后其实有一套精密的视…...
ExplorerPatcher完整指南:轻松定制Windows界面,打造专属工作环境
ExplorerPatcher完整指南:轻松定制Windows界面,打造专属工作环境 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 还在为…...
CANN/GE动态输入Python构图示例
样例使用指导 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…...
