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, false00null, 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, false00null, 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 = 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)

{

//创建查询信息的 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

原文地址:https://www.cnblogs.com/lg100010/p/8971744.html

时间: 2024-10-10 09:47:39

C 实现基于角色的权限系统的相关文章

基于角色的权限管理系统

我们开发业务系统的时候,基本上都会涉及到权限管理模块,要求不同的人看到不同的菜单,操作不同的按钮,看到不同的数据.很多初学者面对这样的需求不知道如何下手,特别是稍微复杂点的权限,更是找不到方向,为此我们夜鹰教程网特别推出了这套基于角色的权限管理视频教程,通过给用户分配角色,给角色分配权限,来实现权限管理.这样一来,可以实现不同的人管理不同的菜单,操作不同的按钮,看到不同的数据.可以划分权限组,每个组的成员拥有相同的权限.也可以把同一个人分配到不同的权限组,具有多个权限组的权限,实现权限的组合.

使用Lync 2013 基于角色的权限控制:RBAC 给用户分配指定的操作权限

使用场景: 在大型的Lync统一沟通系统的日常运维中,我们需要为不同角色的管理员分配不同的Lync管理权限,在Lync Server 2013上面就使用了基于角色的权限控制:RBAC ,它里面分了多种权限角色,包括 CsAdministrator,CsUserAdministrator,CsVoiceAdministrator,CsServerAdministrator,CsViewOnlyAdministrator,CsHelpDesk等等,不同的角色有不同的Lync管理权限, 例如,当我们只

ASP.net MVC 基于角色的权限控制系统的实现

一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.RequestContext

基于角色的权限设计(一)

在任何系统中,权限设计是最基础的东西,本文给出一个基于角色的权限设计的循序渐进的设计方案. 在权限系统中,功能(权限)是最小的单位,比如起草新闻.编辑新闻.审核新闻.删除新闻等,而角色是一类功能的集合,比如新闻编辑 这个角色,他可能有起草新闻.编辑新闻等功能集合,而责任编辑他可能就有更多的权限,比如除了新闻编辑的功能,还有审核新闻.删除新闻等功能,给张三赋予 新闻编辑的角色(其实我更愿意说把张三加入到新闻编辑这个角色中去),张三就可以起草新闻.编辑新闻了,给李四赋予责任编辑的角色,李四就可以起草

从零开始——基于角色的权限管理01(补充)

此博文较为详细的介绍从零开始--基于角色的权限管理01文中的两个部分的流程(解释代码). 1) index.jsp中提交跳转action action的login,获取jsp页面传过来的用户名密码和验证码,进行验证 首先到userDao中,执行login方法,判断是否存在这组用户名和密码 接着到roleDao中,执行getRoleNameById以获取角色名 最后,进入main.jsp中 2)在main.jsp中,有一个树的显示,再次进入authServlet中执行menuAction   先后

基于角色的权限控制

首先要明白的有一个表就是需要记录整个项目中控制器和方法,这样在权限检测的时候就可以检测数据库对应的角色有没有这个控制器或者方法的权限, 但是需要明白的是在开发的过程中当然需要把这种权限给取消,这样在开发过程是需要增加一个控制器或者方法就不需要验证权限,然后开发好了之后就需要 在权限表中增加该控制器和方法. 一般基于角色的权限控制,需要用到下面的几张表 1.用户表2,权限表,3.角色表,4权限角色关系表5用户角色关系表 这种方式是用户通过,用户角色关系表查询出自己的角色,然后通过权限角色关系表查出

ASP.NET MVC 基于角色的权限控制系统的示例教程

上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于角色的权限控制方法. 基于角色的权限控制方法概述 基于角色的权限控制系统RBAC(Role Based Access Control)是目前最流行,也是最通用的权限控制系统.所谓基于角色的权限控制,就是将各个操作权限分组,每一个组就是一个角色,举个例子:管理员拥有所有的权限,编辑就只拥有写文章和发布

webapi框架搭建-安全机制(三)-基于角色的权限控制

webapi框架搭建系列博客 上一篇已经完成了"身份验证",如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使用方法 配置Authorize 比较简单,直接上代码 using System.Collections.Generic; using System.Net.Http; using System.Security.Claims; using System.Web.Http; using we

基于角色的权限访问控制初步

基于角色的权限访问控制(Role-Based Access Control) 角色访问控制(RBAC)引入了role的概念,目的是为了隔离user(即动作主体,subject)与privilege(权限,表示对resource的一个操作,即operation+resource).role作为一个用户(user)与权限(privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予role而不是直接给user或 group.privilege是权限颗粒,由operation和resour