标签:
把自己以前设计权限的思路记录下来
用到的框架是asp.net mvc+easyui
记得以前刚开始接触权限的时候,听老师讲的天花乱坠,我只听懂了一半,还有一半思想短路了,当时布置作业说要写个自己的权限管理,对于那时的我压力还是很大的,开始写的时候呢就把听懂的一半写出来了,还有一半感觉很复杂,而且实现的权限功能个人感觉不怎么好,因为那时教的权限是基本的,没有深入去讲,怕我们这群小白顶不住,按钮权限还要用反射来做,我那时就不想按原来的套路搞了,原本的权限是用户登录后根据个人权限分配菜单,这个容易,然后没个菜单都有专属的页面,每个菜单页面都有权限的操作按钮,而原来的套路是点击里面的按钮,有权限的话就正常执行,没权限的话就弹出你没有权限,那时我就觉得这功能蛋疼了,没有权限你显示出这个按钮来干嘛呢,还等用户点击后才判断你没有权限,这功能真心要不得,所以后来自己就想没有权限就连按钮都不创建显示,让用户看都看不到,这样就好多了,于是照着自己的思路来设计了。
先来看看几个数据库表,自己瞎搞的,只供测试用
MenuManager(菜单管理表)
Role(角色表)
UserMenuPower(用户菜单权限表)
UserButtonPower(用户按钮权限表)
PageButtons(操作按钮表)
RoleButtonPower(角色按钮权限表)
RoleMenuPower(角色菜单权限表)
这就是大致的数据库表,表设计好了,接下来就是功能实现了
首先用最简单的结构,左边一个树形菜单,右边展示界面来做,菜单查询所以的菜单表来显示,当然,查询的时候肯定会加入用户权限的,下面是添加菜单权限的代码
1 public ContentResult GetChild() //获取菜单节点 2 { 3 User u = Session["user"] as User;//根据用户来到数据库查找有无菜单权限 4 ContentResult cr = new ContentResult(); 5 cr.ContentType = "application/json"; 6 TreeNodes root = null; 7 if (u != null)//登录状态执行菜单添加 8 { 9 root = new TreeNodes() { text = "所有菜单", iconCls = "icon-menu" }; 10 List<MenuManager> mmList = oMan.GetMenuManagers(); 11 foreach (MenuManager mm in mmList) 12 { 13 if (mm.ParentID == null || mm.ParentID == "")//添加一级菜单(无上级菜单编号的项) 14 { 15 TreeNodes node = new TreeNodes() { id = mm.ID, iconCls = "icon-"+mm.IconCls, text = mm.ManagerName }; 16 if (IsRoleMenuPower(u.ID, mm.ID) || IsUserMenuPower(mm.ID))//判断权限添加 17 { 18 root.children.Add(node); continue; 19 } 20 } 21 else 22 AddChilder(root, mm, mmList); 23 } 24 } 25 else 26 { 27 root = new TreeNodes() 28 { 29 text = "NULL" 30 }; 31 } 32 string json = new JavaScriptSerializer().Serialize(root); 33 //因为属性菜单的json格式是特定的,所以要把它转成特定的格式 34 json = "[" + json.Replace(",\"children\":null", "") + "]"; 35 cr.Content = json; 36 return cr; 37 } 38 39 private void AddChilder(TreeNodes root, MenuManager mm, List<MenuManager> mmList)//递归添加子节点 40 { 41 User u = Session["user"] as User; 42 foreach (MenuManager m in mmList) 43 { 44 foreach (TreeNodes tn in root.children) 45 { 46 //tn.id == mm.ParentID锁定好要添加的目录,m.ID == mm.ID判断要添加的子节点信息 47 if (tn.id == mm.ParentID && m.ID == mm.ID)//锁定目录添加指定的子节点 48 { 49 //加上该判断则子节点也要权限才能经行添加,否则根据父节点来判断是否有子节点的权限 50 if (IsRoleMenuPower(u.ID, mm.ID) || IsUserMenuPower(mm.ID))//判断权限添加 51 { 52 tn.children.Add(new TreeNodes() { id = m.ID, iconCls = "icon-" + m.IconCls, text = m.ManagerName }); 53 } 54 } 55 } 56 } 57 //添加菜单后在次判断是否有节点有子菜单 58 foreach (MenuManager m in mmList) 59 { 60 foreach (TreeNodes tn in root.children) 61 { 62 //tn.id == mm.ParentID && 63 if (m.ParentID == mm.ID)//锁定子节点,在递归添加进来 64 { 65 AddChilder(tn, m, mmList);//递归添加节点 66 } 67 } 68 } 69 } 70 71 private bool IsRoleMenuPower(int UserID, string MenuID)//角色权限判断 72 { 73 List<UserRolePower> rList = oMan.GetUserRolePower(UserID);//获取当前用户所有所属角色 74 foreach (UserRolePower r in rList) 75 { 76 List<RoleMenuPower> pList = pMan.GetRoleMenuPower(r.RoleID);//得到指定角色的角色权限 77 foreach (RoleMenuPower p in pList)//循环每个角色的权限 78 { 79 if (p.MenuManagerID == MenuID)//判断是否有权限 80 { 81 return true; 82 } 83 } 84 } 85 return false; 86 } 87 private bool IsUserMenuPower(string MenuID)//用户权限判断 88 { 89 User u = Session["user"] as User; 90 List<UserMenuPower> pList = pMan.GetUserMenuPower(u.ID); 91 foreach (UserMenuPower p in pList)//循环每个用户的权限 92 { 93 if (p.MenuManagerID == MenuID)//判断是否权限 94 { 95 return true; 96 } 97 } 98 return false; 99 }
然后就是根据不同的用户和不同的菜单来获取不同的页面按钮权限了,因为按钮权限是动态的,所以操作按钮要是动态生成的,见上面数据库按钮表,而要动态获取菜单页面按钮的话,首先写一个帮助类,用于区别,首先要知道是哪个菜单,这个肯定的,不然怎么判断按钮在哪个菜单下呢,还有要知道是哪个用户在操作啊,这样参数就可以肯定了,废话不多说,下面是按钮权限的代码
1 public class HelperButton 2 { 3 private IPowersManager pMan { get; set; } 4 private IOtherManager oMan { get; set; } 5 public bool EditPower { get; set; } 6 public HelperButton(IPowersManager pMan,IOtherManager oMan) 7 { 8 this.pMan = pMan; 9 this.oMan = oMan; 10 } 11 /// <summary> 12 /// 获取权限按钮 13 /// </summary> 14 /// <param name="Controller">所属控制器名称(省略Controller)</param> 15 /// <param name="PowerGrade">角色权限等级</param> 16 /// <returns>按钮集合</returns> 17 private string GetButton(string Controller,string bName) 18 { 19 string t = "this"; 20 //获取按钮 21 PageButton btn = pMan.GetPageButton(bName); 22 //if (btn.IsThis.Value)//是否传递this ,可以从数据库删除该列,默认都添加this 23 // t = "this"; 24 if (btn.ImpleMentMethod == "TabEdit") 25 EditPower = true; 26 string button = "{text: ‘"+btn.ButtonName+"‘, iconCls: ‘icon-"+btn.IconCls+"‘, handler: function () { "+btn.ImpleMentMethod+"("+t+"); }}"; 27 return button; 28 } 29 /// <summary> 30 /// 获取按钮集合 31 /// </summary> 32 /// <param name="u">用户User</param> 33 /// <param name="Controller">控制器名称,以后功能扩展的,这里不用它</param> 34 /// <param name="text">菜单名称</param> 35 /// <returns>对应权限的按钮集合</returns> 36 public string GetButtons(User u, string Controller,string text)//获取权限菜单按钮 37 { 38 EditPower = false; 39 //因为每个模块的触发事件都不一样,所以为每个模块都不同的按钮及事件,这样也方便为单独哪个模块特殊处理 40 List<UserRolePower> rList = oMan.GetUserRolePower(u.ID);//获取用户所有角色 41 StringBuilder result = new StringBuilder("toolbar:["); 42 List<UserButtonPower> uList = pMan.GetUserButtonPower(u.ID);//获取用户按钮权限 43 int? length = oMan.GetButtonPowerMax();//按钮最大编号 44 if (length == null) 45 length = 0; 46 string[] bs = new string[(int)length];//利用数组获取数据,避免重复获取数据 47 foreach (UserButtonPower p in uList) 48 { 49 int? OrderBy = p.PageButton.OrderBy; 50 if (length < OrderBy) 51 new Exception("数据库中没有该按钮ID,该ID编号不存在"); 52 if (OrderBy != null && p.MenuManager.ManagerName == text)//是否是所属菜单下的按钮 53 bs[(int)OrderBy - 1] = GetButton(Controller, p.PageButton.ButtonName); 54 } 55 foreach (UserRolePower r in rList) 56 { 57 //获取指定角色的按钮权限 58 List<RoleButtonPower> pList = pMan.GetRoleButtonPower(r.RoleID); 59 foreach (RoleButtonPower p in pList) 60 { 61 int? OrderBy = p.PageButton.OrderBy; 62 if (length < OrderBy) 63 new Exception("数据库中没有该按钮ID,该ID编号不存在"); 64 if (OrderBy != null && p.MenuManager.ManagerName == text)//指定菜单下的按钮 65 bs[(int)OrderBy - 1] = GetButton(Controller, p.PageButton.ButtonName); 66 } 67 } 68 foreach (string s in bs) 69 { 70 if(s != null && s != "") 71 result.Append(s + ",‘-‘,"); 72 } 73 //应为如果没有权限后面 74 string buttons = result.ToString().Substring(0, result.ToString().Length - 1)+"]"; 75 if (buttons.Length < 11)//表示没有按钮权限的用户,没有数据 76 buttons = ""; 77 return buttons; 78 } 79 }
这样权限就有了,用户可以随意的编辑更改用户的权限,没有权限你什么都看不到,有了权限,你什么都可以看到
接下来是我分别用admin管理员登录和普通用户lili来登录的效果图
由此可见,管理员有最高权限,当然,要你设置完权限后才有的
而lili则凄惨了
权限是多变的,但是大致思路都一样,自己想设计成什么样子就按着自己的思路来做,慢慢的来完善
最好的结论就是,实际动手才能深入了解,不然YY的在美好,也会像“阳光下的泡沫,一触就破”
标签:
原文地址:http://www.cnblogs.com/LiuZhen/p/4315401.html