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 ;
else
return 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 ;
else
return 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 ;
else
return 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 = new Dictionary<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)
{
//创建查询信息的 SQL
string 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 ;
else
return 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特性的使 ...
随机推荐
- UNIX环境高级编程——select和epoll的区别
select和epoll都用于监听套接口描述字上是否有事件发生,实现I/O复用 select(轮询) #include <sys/select.h> #include <sys/ti ...
- golang:高性能消息队列moonmq的简单使用
在上一篇moonmq的介绍中(这里),我仅仅简短的罗列了一些moonmq的设计想法,但是对于如何使用并没有详细说明,公司同事无法很好的使用. 对于moonmq的使用,其实很简单,样例代码在这里,我们只 ...
- 什么是IOC
什么是IOC IOC:控制反转,控制权的转移,应用程序本身不负责对象的创建和维护,而是由外部容器负责创建和维护. DI(依赖注入)是其一种实现方式 目的:创 ...
- 解决在onCreate()过程中获取View的width和Height为0的方法
最近在看Android底层代码的view绘制原理的时候讲到一个很有意思的事情,也是我几年前刚开始学习Android开发的时候比较纳闷的一个问题,如果你不理解Android的底层绘制,请看我之前一片文章 ...
- (三十六)利用AFNetworking进行JSON数据解析
1.首先要安装CocoaPods,然后在需要AFNetworking的工程根目录建立podfile,内容如下: platform :ios, '7.0' pod 'AFNetworking' 2.然后 ...
- 《java入门第一季》集合框架引入与面试题
注:在开始的几篇集合介绍里,不包含泛型的概念.泛型在讲述所有集合后再加入进去. 集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我 ...
- Mahout 系列之----共轭梯度
无预处理共轭梯度 要求解线性方程组 ,稳定双共轭梯度法从初始解 开始按以下步骤迭代: 任意选择向量 使得 ,例如, 对 若 足够精确则退出 预处理共轭梯度 预处理通常被用来加速迭代方法的收敛.要使用预 ...
- centos6.5 rsync+inotify实现服务器之间文件实时同步
1. rsync的优点与不足 与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据 ...
- LIRe 源代码分析 2:基本接口(DocumentBuilder)
===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...
- PS图层混合算法之四(亮光, 点光, 线性光, 实色混合)
亮光模式: 根据绘图色通过增加或降低"对比度",加深或减淡颜色.如果绘图色比50%的灰亮,图像通过降低对比度被照亮,如果绘图色比50%的灰暗,图像通过增加对比度变暗. 线性光模式: ...