.NET之后台用户权限管理实现_实用技巧

序:在功能性比较强大的后台管理网站处于各种角度考虑多有应用权限管理功能。以公司内部管理系统为例,管理员根据不同员工所在不同部门赋予其不同权限,或者根据上下级隶属关系实现“金字塔”管理。本文内容有不尽不实之处恳请指正。

正文:
如下效果图是否令某用户具备相应权限用checkbox状态区别存储。

(一)储存
这里的权限功能(类别)名称和权限模块(具体)名称均是手动输入数据库,不可增删改查。本例将某权限模块作为最基本元素,是否具备该权限用1或0表示,进而将当前用户所有权限链接组成二进制字符串储存在数据库中。如示例代码1.1

(二)读取 如示例代码1.2

(三)前台代码 如下

复制代码 代码如下:

//利用js添加逗号和竖线 ,通过hidden传值

<script language="javascript" type="text/javascript">

function getcheck() {
var inputs = document.getElementById("cbpanel");
var chks = inputs.getElementsByTagName("input");
var str = "";
for (var i = 0; i < chks.length; i++) {
if (chks[i].type == 'checkbox') {
str += chks[i].value + "," + chks[i].checked + "|";
}
}
document.getElementById("Hidden1").value = str;
}

<script>

<body>

<div id="cbpanel"> <asp:Literal ID="LiteralRole" runat="server"></asp:Literal>

<input id="Hidden1" runat="server" type="hidden" /></div>

</body>

复制代码 代码如下:

示例代码1.2
 /// <summary>
         /// 绑定所有模块分类
         /// </summary>
         private void BindAllModule()
         {
             StringBuilder sb = new StringBuilder();
             sb.Append("<table class=\"AddRole\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">");
             Bll_User_Module mbll = new Bll_User_Module();
             IList<User_Model.Model_User_Module> list = mbll.GetAllList();//得到泛型集合
              string moduleidstr = "";
              for (int i = 0; i < list.Count; i++)
              {
                  sb.Append("<tr><th style=\"width: 100px; height: 36px;\">");
                  sb.Append(list[i].ModuleName);
                  sb.Append("</th>");
                  sb.Append("<td>");
                  sb.Append("{" + list[i].ID + "}");
                  sb.Append("</td></tr>");
                  moduleidstr += list[i].ID.ToString() + ",";
              }
              sb.Append("</table>");

              if (Request.QueryString["nid"] != null)
              {
                  //修改
                  BLL_User_Role mrbll = new BLL_User_Role();

                  User_Model.Model_User_Role mrmodel = mrbll.GetModel(Convert.ToInt32(Request.QueryString["nid"]));
                  string RoleActions = mrmodel.RoleAction;
                  BindAllFunction(moduleidstr, sb, RoleActions);
              }
              else
              {
                  //新增
                  BindAllFunction(moduleidstr, sb, "");
              }
         }
         /// <summary>
         /// 绑定每个模块中的各个功能选项
         /// </summary>
         /// <param name="moduleidstr">模块数</param>
         /// <param name="sb">html表格</param>
         /// <param name="RoleActions">权限二进制字符串</param>
         private void BindAllFunction(string moduleidstr, StringBuilder sb, string RoleActions)
         {
             Bll_User_Function bll = new Bll_User_Function();
             IList<User_Model.Model_User_Function> list = bll.GetAllList();//功能表泛型集合
             moduleidstr = moduleidstr.TrimEnd(',');//用逗号间隔功能模块数
             string[] str = moduleidstr.Split(',');//移除逗号,以数组形式保存
             for (int i = 0; i < str.Length; i++)//循环数组
             {
                 StringBuilder funsb = new StringBuilder();
                 for (int j = 0; j < list.Count; j++)
                 {
                     if (list[j].ModuleNo == Convert.ToInt32(str[i]))
                     {
                         if (RoleActions == "")
                         {
                             //新增
                             funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" checked=\"checked\" value=\"" + list[j].FuncNo.ToString() + "\" />");
                             funsb.Append(list[j].FuncName + "  ");
                         }
                         else
                         {
                             //修改
                             if (RoleActions.Length >= list[j].FuncNo)
                             {
                                 //FuncNO代表当前权限位于二进制字符索引值
                                 if (RoleActions.Substring(list[j].FuncNo - 1, 1) == "1")//截取权限二进制字符串并判断其状态
                                 {
                                     //选中状态
                                     funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" checked=\"checked\" value=\"" + list[j].FuncNo.ToString() + "\" />");
                                     funsb.Append(list[j].FuncName + "  ");
                                 }
                                 else
                                 {
                                     //非选中状态
                                     funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" value=\"" + list[j].FuncNo.ToString() + "\" />");
                                     funsb.Append(list[j].FuncName + "  ");
                                 }
                             }
                             else
                             {
                                 funsb.Append("<input id=\"" + list[j].FuncNo.ToString() + "\" type=\"checkbox\" value=\"" + list[j].FuncNo.ToString() + "\" />");
                                 funsb.Append(list[j].FuncName + "  ");
                             }
                         }
                     }
                 }
                 //替换功能项
                 sb.Replace("{" + str[i] + "}", funsb.ToString());
             }
             LiteralRole.Text = sb.ToString();     
         }

 // 保存(更新)事件
 protected void Submit_Click(object sender, EventArgs e)
 {
 string cbstr = Hidden1.Value;//获取前台hidden传值,如 “1,true|2,true|3,false|4,true”形式

 ........

 }

复制代码 代码如下:

示例代码1.1
 /// <summary>
         /// 生成角色二进制字符串
         /// </summary>
         /// <param name="str"></param>
         /// <returns>二进制序列</returns>
         private string GenerateRoleAction(string str)
         {
            //虚拟表构建两列存储权限序列号及其状态
             DataTable dt = new DataTable();
             DataColumn col1 = new DataColumn("funno", typeof(int));
             dt.Columns.Add(col1);
             DataColumn col2 = new DataColumn("flag");
             dt.Columns.Add(col2);

             string[] strarray = str.TrimEnd('|').Split('|');//截取任意两个二进制元素之间竖线
             for (int i = 0; i < strarray.Length; i++)
             {
                 DataRow dr = dt.NewRow();
                 dr[0] = strarray[i].Split(',')[0];//权限序列号
                 dr[1] = strarray[i].Split(',')[1];//权限状态,用true和false区别记录
                 dt.Rows.Add(dr);
             }

             dt.DefaultView.Sort = "funno asc";
             DataTable dttemp = dt.DefaultView.ToTable();
             //将状态列转换为二进制字符
             string s = "";
             for (int j = 0; j < dttemp.Rows.Count; j++)
             {
                 if (dttemp.Rows[j]["flag"].ToString().ToLower() == "true")
                 {
                     s += "1";//选中状态(true,即具备该权限)用1表示
                 }
                 else
                 {
                     s += "0";//非选中状态(false,即不具备该权限)用0表示
                 }
             }
             return s;//返回象征权限的二进制字符串
         }

时间: 2024-08-03 02:00:49

.NET之后台用户权限管理实现_实用技巧的相关文章

asp.net 权限管理分析_实用技巧

权限管理一般分为"用户管理""角色管理""权限管理".而其中的权限管理,主要是针对某一模块实现"添加""修改""删除"的针对性控制,比如某个用户有"添加文章"的权限,但没有"修改(审核)文章"的权限.以下我主要先讲下"权限管理". 首先,存进数据库的格式,看下: 复制代码 代码如下: news:3,gallery:1,users

asp.net微信开发(用户分组管理)_实用技巧

上一篇已讲解到新建用户分组,移动用户到分组的功能,这一章主要讲解修改分组名称和删除分组 直接上代码,废话不多说,获取分组列表需要用到的实体类 /// <summary> /// 微信分组类 /// </summary> public class WxGroupsInfo { public string Group_ID { get; set; }//分组编号 public string Group_Name { get; set; }//分组名称 public string Gro

asp.net+sqlserver实现的简单高效的权限设计示例_实用技巧

大部分系统都有权限系统.一般来说,它能管控人员对某个否页面的访问:对某些字段.控件可见或者不可见.对gridview中的数据是否可删除.可添加.可新增等等.大部分人都把权限作为一个子系统独立出来.但是这里我不是想设计一个权限管理系统,网上的设计方案太多了,可以说每个开发人员都有自己的开发权限管理系统的想法和思路. 在这篇文章中,我先用简单的C#代码模仿一个用户的权限,再使用sql去模拟.这是一种很简单,很直观,很高效的方式去判定用户的权限. C#: 好吧,先从最简单开始,定义一个用户(User)

asp.net微信开发(永久素材管理)_实用技巧

除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材. 最近更新,永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽). 请注意: 1.新增的永久素材也可以在公众平台官网素材管理模块中看到 2.永久素材的数量是有上限的,请谨慎新增.图文消息素材和图片素材的上限为5000,其他类型为1000 3.素材的格式大小等要求与公众平台官网一致.具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/

MVC4制作网站教程第二章 部分用户功能实现代码_实用技巧

用户部分要实现的功能有: 序 一.用户  1.1用户注册  1.2用户登录  1.3修改密码  1.4修改资料 要实现这些目的首先新建用户(Model)模型 /// <summary> /// 用户模型 /// </summary> public class User { [Key] public int UserId { get; set; } /// <summary> /// 用户组Id /// </summary> [Display(Name=&qu

asp.net微信开发(已关注用户管理)_实用技巧

公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成.一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取的方式来满足需求. 接口调用请求说明 http请求方式: GET(请使用https协议) 返回说明 正确时返回JSON数据包: 错误时返回JSON数据包(示例为无效AppID错误): {"errcode":40013,"errmsg":"invalid

asp.net微信开发(自定义会话管理)_实用技巧

和微信用户的沟通少不了,总觉得看起来微信官网后台管理中的会话回复消息有点呆板,所以我这里就自定义了一个会话管理功能,最终效果图如下: 因为我试使用富文本文件CKEDITOR来进行编写,你看到稳中可能会有<P></p>字段,后台获取数据内容时,替换为空字符即可:如下 string txtcontent = this.txtMessage.Value.ToString().Replace("<p>", ""); StringBuild

ASP.NET用户控件技术_实用技巧

我们发现,利用代码绑定技术我们可以容易的将我们的代码和内容分离开来,利用它可以建立可重用的代码,只是这种技术本身也存在着一些局限性.在本文中,我们将会一同探讨另外一种新的ASP.NET技术:用户控件.    什么是用户控件(User Controls)?  为了能更好的理解用户控件的重要性,我们先来看看一段小小的"历史".在以前的ASP当中,可重用的技术实现选择是相当受限制的.许多的开发者一般都是借助将公共的常用的子过程放到那些包含文件当中的做法来实现一定的所谓代码重用的.比如,如我们

ASP.NET对HTML页面元素进行权限控制(三)_实用技巧

上一篇博客中有些没有考虑到的东西这次更改一下代码如下: 界面前台: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AdmShowDIV.aspx.cs" Inherits="ExamSystemV3.Manager.RoleManager.AdmShowDIV" %> <!DOCTYPE html> <ht