C 实现基于角色的权限系统

Wesley13
• 阅读 514

本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1068

实例使用C# 实现基于角色的权限菜单管理系统, 管理员可以添加用户,删除用户, 添加分组,删除分组, 添加角色,删除角色,为角色关联权限等功能, 管理员用户自定义各个操作员的权限菜单标题

项目对应的实例代码可以通过右侧【下载实例】按钮获取

开发工具: VS2012 数据库: SQLServer

【项目包含内容】(见下图):

【实例代码】

【DBScript】 脚本

【WinForm中实现基于角色的权限菜单详解.txt】 代码详解

C 实现基于角色的权限系统

【实例简介】

C# WinForm中实现基于角色的权限菜单的完整源码,数据库脚本在DBscript目录下,在sql server 依次执行如下脚本即可

C 实现基于角色的权限系统

执行完毕后 修改下 app.config中的数据库连接串 为你本机的即可

【实例截图】

下面为管理员登陆后的效果

管理员账号:admin

密码:666666

C 实现基于角色的权限系统

C 实现基于角色的权限系统

C 实现基于角色的权限系统

C 实现基于角色的权限系统

C 实现基于角色的权限系统

C 实现基于角色的权限系统

下面为普通用户登陆后的效果:

普通用户名:user 密码 111111

C 实现基于角色的权限系统

C 实现基于角色的权限系统

【核心代码】

/// <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](https://my.oschina.net/u/916685), @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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
RBAC模型
RBAC基于角色的访问控制(RoleBasedAccessControl)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用
Wesley13 Wesley13
3年前
java用户角色权限设计
实现业务系统中的用户权限管理B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能。因此B/S业务系统都需要有
Wesley13 Wesley13
3年前
RBAC基于角色的权限管理
RBAC基于角色的权限管理设计篇1.1RBAC基于角色的权限管理设计篇1.0https://my.oschina.net/xiaozhutefannao/blog/1600612(https://my.oschina.net/xiaozhutefann
Stella981 Stella981
3年前
Spring Security使用详解4(基于数据库的URL权限规则配置)
虽然前面我们实现了通过数据库来配置用户与角色,但认证规则仍然是使用HttpSecurity进行配置,还是不够灵活,无法实现资源和角色之间的动态调整。要实现动态配置 URL权限,就需要开发者自定义权限配置,具体步骤如下。四、基于数据库的URL权限规则配置 1、数据库设计这里的数据库在前文(点击查看)的基础上增加一张资
Stella981 Stella981
3年前
Spring Security使用详解2(基于内存的用户、URL权限配置 )
二、基于内存的用户、URL权限配置1、用户角色配置(1)我们可以通过自定义类继承WebSecurityConfigurerAdapter,从而实现对SpringSecurity更多的自定义配置。比如下面样例我们就配置了两个用户,以及他们对应的角色。注意:基于内存的用户配置在配置角色时不需要添加“ROLE\_”前缀,而
Stella981 Stella981
3年前
PHP Laravel5实现的RBAC权限管理操作示例
根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,可以根据菜单的例子,请自行完善,开发。下面请认真学习一下laravel的RBAC设计1、建表(用户表、角色表、权限表、用户角色表、角色权限表)1CREATETABLEIFNOTEXISTSmr_role2(3id
Easter79 Easter79
3年前
Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构核心技术
内置功能(只列了一部分功能)1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。2.机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。4.菜单管理:配置系统菜单,操作权限,按钮权限标识等。5.角色管理:角色菜单权限分配、设置角色按机构进行
Easter79 Easter79
3年前
SSH ++shiro+restful+bootstrap java架构
内置功能(只列了一部分功能)1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。2.机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。4.菜单管理:配置系统菜单,操作权限,按钮权限标识等。5.角色管理:角色菜单权限分配、设置角色按机构进行
Stella981 Stella981
3年前
SSH ++shiro+restful+bootstrap java架构
内置功能(只列了一部分功能)1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。2.机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。4.菜单管理:配置系统菜单,操作权限,按钮权限标识等。5.角色管理:角色菜单权限分配、设置角色按机构进行
Stella981 Stella981
3年前
PostgreSQL学习手册(十) 角色和权限
 PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户。角色可以拥有数据库对象,如表、索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些对象拥有哪些权限。    一、数据库角色:   1\.创建角色:   CREATEROLE