C 实现基于角色的权限系统
本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1068
实例使用C# 实现基于角色的权限菜单管理系统, 管理员可以添加用户,删除用户, 添加分组,删除分组, 添加角色,删除角色,为角色关联权限等功能, 管理员用户自定义各个操作员的权限菜单标题
项目对应的实例代码可以通过右侧【下载实例】按钮获取
开发工具: VS2012 数据库: SQLServer
【项目包含内容】(见下图):
【实例代码】
【DBScript】 脚本
【WinForm中实现基于角色的权限菜单详解.txt】 代码详解
【实例简介】
C# WinForm中实现基于角色的权限菜单的完整源码,数据库脚本在DBscript目录下,在sql server 依次执行如下脚本即可
执行完毕后 修改下 app.config中的数据库连接串 为你本机的即可
【实例截图】
下面为管理员登陆后的效果
管理员账号:admin
密码:666666
下面为普通用户登陆后的效果:
普通用户名:user 密码 111111
【核心代码】
/// <summary>/// 根据操作员名称和密码获取操作员实体/// </summary>/// <param name="name">操作员名称</param>/// <param name="pwd">操作员密码</param>/// <returns>操作员实体</returns>public Model.Operator GetOperatorInfoByName(string name, string pwd){//SQL命令string sqltxt = string.Format("Select Id, OperatorName, Password, RightsList, State From Operator Where OperatorName = '{0}' And Password = '{1}'", name, pwd);//创建操作员实体Model.Operator tmpOperator = new Model.Operator();// 转换数据库存储的 二进制数据为 Byte[] 数组 以便进而转换为操作员权限集合// 从配置文件读取连接字符串string connectionString = ConfigurationManager.ConnectionStrings["SQLSERVER"].ConnectionString;// 执行 SQL 命令using (SqlConnection conn = new SqlConnection(connectionString)){SqlCommand cmd = new SqlCommand(sqltxt, conn);conn.Open();using (SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection |CommandBehavior.SingleResult |CommandBehavior.SingleRow)){if (myReader.Read()){//将数据集转换成实体集合tmpOperator.Id = Convert.ToInt32(myReader["Id"]);tmpOperator.ModelName = Convert.ToString(myReader["OperatorName"]);tmpOperator.Password = Convert.ToString(myReader["Password"]);tmpOperator.State = Convert.ToBoolean(myReader["State"]);// 读取权限集合System.Data.SqlTypes.SqlBytes bytes = myReader.GetSqlBytes(3); // 只能指定列序号// 将流反序列化为权限集合对象BinaryFormatter bf = new BinaryFormatter();if (!bytes.IsNull)tmpOperator.RightsCollection = (bf.Deserialize(bytes.Stream) as Dictionary<string, Model.Rights>);//else// throw new Exception(string.Format("操作员 [{0}] 没有任何权限,禁止登录!", tmpOperator.ModelName));}else//如果没有读取到内容则抛出异常throw new Exception("登录名称或用户密码不正确!");}}// 如果操作员已经被禁用if (!tmpOperator.State)throw new Exception(string.Format("操作员 [{0}] 已被禁用,请与管理员联系!", tmpOperator.ModelName));// 返回结果return tmpOperator;}/// <summary>/// 添加操作员/// </summary>/// <param name="addOperator">要添加的操作员实体</param>/// <returns>True:成功/False:失败</returns>public bool AddOperator(Model.Operator addOperator){// 验证密码长度if (addOperator.Password.Trim().Length < 6)throw new Exception("用户密码长度不能小于六位!");// 转换操作员权限集合为数据库可存取的 Byte[] 数组MemoryStream ms = new MemoryStream();BinaryFormatter bf = new BinaryFormatter();bf.Serialize(ms, addOperator.RightsCollection);byte[] rigthsByteArray = new byte[(int)(ms.Length)];ms.Position = 0;ms.Read(rigthsByteArray, 0, (int)(ms.Length));ms.Close();// 拼接 SQL 命令string sqlTxt = "Insert Into Operator (OperatorName, Password, RightsList, State) Values ""(@OperatorName, @Password, @RightsList, @State)";// 从配置文件读取连接字符串string connectionString = ConfigurationManager.ConnectionStrings["SQLSERVER"].ConnectionString;// 执行 SQL 命令using (SqlConnection conn = new SqlConnection(connectionString)){SqlCommand cmd = new SqlCommand(sqlTxt, conn);SqlParameter prm1 = new SqlParameter("@OperatorName", SqlDbType.NVarChar, 50);prm1.Value = addOperator.ModelName;SqlParameter prm2 = new SqlParameter("@Password", SqlDbType.NVarChar,50);prm2.Value = addOperator.Password;SqlParameter prm3 = new SqlParameter("@RightsList", SqlDbType.VarBinary, rigthsByteArray.Length,ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, rigthsByteArray);SqlParameter prm4 = new SqlParameter("@State", SqlDbType.Bit);prm4.Value = addOperator.State;cmd.Parameters.AddRange(new SqlParameter[] { prm1, prm2, prm3, prm4 });conn.Open();if (cmd.ExecuteNonQuery() >= 1)return true;elsereturn false;}}/// <summary>/// 删除操作员/// </summary>/// <param name="id">要删除的操作员 ID</param>/// <returns>True:成功/False:失败</returns>public bool DeleteOperatorByID(int id){// 删除单个信息 SQL 命令string sqlTxt = string.Format("Delete From Operator Where Id = {0}", id);// 创建 SQL 执行对象DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance();// 执行 删除操作int rowsAffected;dbProvider.RunCommand(sqlTxt, out rowsAffected);if (rowsAffected >= 1)return true;elsereturn false;}/// <summary>/// 修改操作员/// </summary>/// <param name="currentOperator">要修改的操作员实体</param>/// <returns>True:成功/False:失败</returns>public bool ModifyOperator(Model.Operator currentOperator){// 验证密码长度if (currentOperator.Password.Trim().Length < 6)throw new Exception("用户密码长度不能小于六位!");// 转换操作员权限集合为数据库可存取的 Byte[] 数组MemoryStream ms = new MemoryStream();BinaryFormatter bf = new BinaryFormatter();bf.Serialize(ms, currentOperator.RightsCollection);byte[] rigthsByteArray = new byte[(int)(ms.Length)];ms.Position = 0;ms.Read(rigthsByteArray, 0, (int)(ms.Length));ms.Close();// 拼接 SQL 命令string sqlTxt = "Update Operator Set OperatorName = @OperatorName, ""Password = @Password, RightsList = @RightsList, State = @State Where Id = @Id";// 从配置文件读取连接字符串string connectionString = ConfigurationManager.ConnectionStrings["SQLSERVER"].ConnectionString;// 执行 SQL 命令using(SqlConnection conn = new SqlConnection(connectionString)){SqlCommand cmd = new SqlCommand(sqlTxt, conn);SqlParameter prm1 = new SqlParameter("@OperatorName", SqlDbType.NVarChar, 50);prm1.Value = currentOperator.ModelName;SqlParameter prm2 = new SqlParameter("@Password", SqlDbType.NVarChar,50);prm2.Value = currentOperator.Password;SqlParameter prm3 = new SqlParameter("@RightsList", SqlDbType.VarBinary, rigthsByteArray.Length,ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, rigthsByteArray);SqlParameter prm4 = new SqlParameter("@State", SqlDbType.Bit);prm4.Value = currentOperator.State;SqlParameter prm5 = new SqlParameter("@Id", SqlDbType.Int);prm5.Value = currentOperator.Id;cmd.Parameters.AddRange(new SqlParameter[] { prm1, prm2, prm3, prm4, prm5 });conn.Open();if (cmd.ExecuteNonQuery() >= 1)return true;elsereturn false;}}/// <summary>/// 获取所有操作员信息/// </summary>/// <returns>操作员实体集合</returns>public Dictionary<string, Model.Operator> GetAllOperatorInfo(){//SQL命令string sqltxt = "Select Id, OperatorName, Password, RightsList, State From Operator";//创建操作员实体集合Dictionary<string, Model.Operator> operatorCollection = newDictionary<string, Model.Operator>();//定义操作员实体Model.Operator tmpOperator = null;// 转换数据库存储的 二进制数据为 Byte[] 数组 以便进而转换为操作员权限集合// 从配置文件读取连接字符串string connectionString = ConfigurationManager.ConnectionStrings["SQLSERVER"].ConnectionString;// 执行 SQL 命令using (SqlConnection conn = new SqlConnection(connectionString)){SqlCommand cmd = new SqlCommand(sqltxt, conn);conn.Open();using (SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)){while (myReader.Read()){// 创建操作员实体tmpOperator = new Model.Operator();//将数据集转换成实体集合tmpOperator.Id = Convert.ToInt32(myReader["Id"]);tmpOperator.ModelName = Convert.ToString(myReader["OperatorName"]);tmpOperator.Password = Convert.ToString(myReader["Password"]);tmpOperator.State = Convert.ToBoolean(myReader["State"]);// 读取权限集合System.Data.SqlTypes.SqlBytes bytes = myReader.GetSqlBytes(3); // 只能指定列序号// 将流反序列化为权限集合对象BinaryFormatter bf = new BinaryFormatter();if (!bytes.IsNull)tmpOperator.RightsCollection = (bf.Deserialize(bytes.Stream) as Dictionary<string, Model.Rights>);// 添加到操作员实体集合operatorCollection.Add(tmpOperator.ModelName, tmpOperator);}}}// 返回结果return operatorCollection;}/// <summary>/// 根据操作员名称校验操作员是否存在/// </summary>/// <param name="operatorName">操作员名称</param>/// <returns>True:存在/Flase:不存在</returns>public bool CheckOperatorExist(string operatorName){//创建查询信息的 SQLstring sqlTxt = string.Format("Select Count(*) From Operator Where OperatorName = '{0}'",operatorName);//创建SQL执行对象DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance();//执行查询操作int result = Convert.ToInt32(dbProvider.RunCommand(sqlTxt));if (result >= 1)return true;elsereturn false;}#endregion |
C 实现基于角色的权限系统的更多相关文章
- Asp.net core IdentityServer4与传统基于角色的权限系统的集成
写在前面 因为最近在忙别的,好久没水文了 今天来水一篇: 在学习或者做权限系统技术选型的过程中,经常有朋友有这样的疑问 : "IdentityServer4的能不能做到与传统基于角色的权限系 ...
- SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建
SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...
- RBAC基于角色的权限访问控制
RBAC是什么,能解决什么难题?ThinkPHP中RBAC实现体系安全拦截器认证管理器访问决策管理运行身份管理器ThinkPHP中RBAC认证流程权限管理的具体实现过程RBAC相关的数据库介绍Th ...
- ASP.net MVC 基于角色的权限控制系统的实现
一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class Custom ...
- 图文详解基于角色的权限控制模型RBAC
我们开发一个系统,必然面临权限控制的问题,即不同的用户具有不同的访问.操作.数据权限.形成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control).强制 ...
- ASP.NET MVC 基于角色的权限控制系统的示例教程
上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...
- 10.spring-boot基于角色的权限管理页面实现
10.spring-boot基于角色的权限管理页面实现
- webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制
webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...
- webapi框架搭建-安全机制(三)-简单的基于角色的权限控制
webapi框架搭建系列博客 上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使 ...
随机推荐
- TCP/IP入门(2) --网络层
/** 本篇博客由 126(127不可用) 2^24 -2 B 2^14 -1 128.1 191.255 2^16 -2 C 2^21 -1 192.0.1 223.255.255 2^8 -2 D ...
- iOS编程中的音频知识(一):文件格式和数据格式,哦!天哪
要明白实际上每个音频文件都有2各部分组成:它的文件格式(或称之为音频容器),和它的数据格式(或称之为音频编码). 文件格式(audio containers)描述文件自身的格式.实际内部的音频数据可以 ...
- Spring注入
Spring注入 Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为. 常用的两种注入方式: setter注入 构造注入 <?xml version=&quo ...
- C#与Oracle数据库
一.连接Oracle数据库 安装客户端: oracle数据库搭建在远程服务器上,本地只需要装个客户端,然后在安装目录下(D:\app\fangs\product\12.1.0\client_3\Net ...
- Leetcode_9_Palindrome Number
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41598031 Palindrome Number Dete ...
- 9.2、Libgdx的输入处理之鼠标、触摸和键盘
(官网:www.libgdx.cn) Libgdx支持的最主要的设备是desktop或浏览器的鼠标支持,Android的触摸屏支持和键盘的支持.我们接下来了解一下. 键盘 用户按下或释放一个按键生成了 ...
- FSM之SMC使用总结
FSM之SMC使用总结 Part1: Smc.jar state machine compiler usage Reference: http://smc.sourceforge.net/ ...
- Java之美[从菜鸟到高手演变]之设计模式二
在阅读过程中有任何问题,请及时联系:egg. 邮箱:xtfggef@gmail.com 微博:http://weibo.com/xtfggef 如有转载,请说明出处:http://blog.csdn. ...
- mysql进阶(二十)CPU超负荷异常情况
CPU超负荷异常情况 问题 项目部署阶段,提交订单时总是出现cpu超负荷工作情况,导致机器卡死,订单提交失败.通过任务管理器可见下图所示: 通过任务管理器中进程信息(见下图)进行查看,可见正是由于项目 ...
- startService与bindService的区别
转自:http://www.devdiv.com/thread-52226-1-1.html Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDes ...