ASP.NET权限控制

这两周一直在给公司做官网,现在已经做好了。趁着周末有时间来梳理一下用到的主要知识点。其实核心技术就两点,第一就是后台权限控制,第二就是前台页面静态化(包括分页列表的静态化)。

第一步:后台权限数据表的建立

现在首先把我想到的权限控制的思路整理一下。权限控制本质是对访问的url路径的控制。本着这个思想我就形成了我的权限控制方法。这其中主要用到了四张表。如下图所示:

浅谈权限控制

第一张表节点表,也就是你所建立的aspx文件的路径。这张表以父Id的形式递归展示。由于我的针对一个实体的CURD操作是通过如下形式进行的(显示和删除对应的文件格式是:../**List.aspx。增加和修改对应的文件格式是:../**Editor.aspx。),所以权限只能控制到实体而不能控制到CURD。

第二张表是角色表,角色和节点是多对多的关系。角色和用户是一对多的关系。现在有些权限控制角色和用户是多对多的关系。所以我这个权限控制的方法有些弊端。

第三张表是权限表。节点集合角色共同决定权限。

第四张表是用户表。我实际上是给角色分配权限。而用户又属于角色。所以用户可以获得对应角色的权限,进行登录后台。

 

第二步:网站后台对应表实体的创建,如下图:

浅谈权限控制

 

 

第三步:后台其他文件的创建:

浅谈权限控制

 

第四步:在节点表中将上图所有文件路径当作节点插入到节点表中,注意层次关系。如下图:

浅谈权限控制

 

 

第五步:在角色列表中,给角色分配权限。实际上就是选择上图中的节点。如下图:

 

浅谈权限控制

 

点击分配权限(先加载节点表中的所有节点,如果当前角色已经分配了权限,则先加载对应的权限),如下图:

浅谈权限控制

 

第六步:在添加用户时会让选择对应的权限。到此时已经完全给用户分配了权限,接下来我们要将如何根据权限控制用户访问。

第七步:当用户登录时,根据用户的id获得对应的角色,从而获得对应的权限。根据权限递归生成左侧菜单树。因此左侧菜单栏也是根据权限动态绑定的。代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Web;
 6 using System.Web.UI;
 7 using System.Web.UI.WebControls;
 8 
 9 public partial class Admin_Default : System.Web.UI.Page
10 {
11     
12     protected string tree = "";
13     protected string loginName = "";
14     protected string admin = "";
15     protected void Page_Load(object sender, EventArgs e)
16     {
17         var user= LoginValidate.Intance.ChekLogin();
18         var role=  ZXJB.DAL.DALFactory.RoleInfo.GetEntitys(c => c.RoleId == user.RoleId).FirstOrDefault();
19 
20         loginName = user.LoginName;
21         admin =role.RoleName+" ["+ user.LoginName+"]";
22         var rights= ZXJB.DAL.DALFactory.RightInfo.GetEntitys(c => c.RoleId == user.RoleId);
23 
24         List<ZXJB.Model.T_Node> nodes = new List<ZXJB.Model.T_Node>();//获得用户对应的所有节点
25         foreach (var item in rights)
26         {
27             nodes.Add(ZXJB.DAL.DALFactory.NodeInfo.GetEntitys(c => c.NodeId == item.NodeId).FirstOrDefault());
28         }
29         nodes = nodes.OrderByDescending(c => c.SortId).ToList();
30         tree = BindTreeView(0,nodes, "");
31     }
32     //递归生成权限
33     string BindTreeView(int parent,List<ZXJB.Model.T_Node> nodes, string str)
34     {
35 
36         StringBuilder sb = new StringBuilder();
37 
38         var childs = nodes.Where(c => c.ParentNodeId == parent).ToList(); //ZXJB.DAL.DALFactory.NodeInfo.GetEntitys(c => c.ParentNodeId == parent);
39         if (parent == 0)
40         {
41             sb.Append("<ul id='tree' class=\"easyui-tree\" >");
42         }
43         else
44         {
45             sb.Append("<ul>");
46         }
47       
48         foreach (var cc in childs)
49         {
50 
51 
52             var ctwo = nodes.Where(c => c.ParentNodeId == parent).ToList(); //ZXJB.DAL.DALFactory.NodeInfo.GetEntitys(c => c.ParentNodeId == cc.NodeId);
53 
54             if (cc.NodeUrl == "#")
55             {
56                 sb.Append("<li>");
57             }
58             else
59             {
60                 sb.Append("<li id='" + cc.NodeUrl.Replace("/Admin/", "") + "'>");
61             }
62             if (ctwo.Count > 0)
63             {
64                 sb.Append("<span> ");
65             }
66 
67             sb.Append(cc.DisplayName);
68             
69             if (ctwo.Count > 0)
70             {
71                 sb.Append("</span>");
72             }
73 
74             if (ctwo.Count > 0)
75             {
76 
77                 sb.Append(BindTreeView(cc.NodeId,nodes, sb.ToString()));
78 
79             }
80             sb.Append("</li>");
81         }
82         sb.Append("</ul>");
83         return sb.ToString();
84     }
85 }
动态功能菜单

相关文章: