1. 程式人生 > >基於RBAC的Easyui樹形許可權選單的實現原理

基於RBAC的Easyui樹形許可權選單的實現原理

      基於角色的許可權管理(RBAC),是一種比較流行的許可權管理模型。基本思路是將許可權集中到角色上,將使用者與許可權掛鉤。更高階的許可權管理可以授權到使用者組以及許可權的繼承。RBAC的基礎知識請自行參閱相關文章,此處不再贅述。最簡單的RBAC框架由五張資料表構成:

       1、使用者表

       2、角色表

       3、使用者角色關聯表

       4、許可權表

       5、角色許可權關聯表

       通過五表聯查即可獲得一個使用者的所有角色以及角色下的所有許可權。

       具體到UI層面,這些許可權總歸要以某種形式展現出來。一般是下拉選單或者樹形選單。這裡我們採用樹形選單來展示,所謂許可權,在EasyUI中可以規劃為一個子頁面,能看到這個子頁面即可在上面進行操作。有興趣的讀者可以參看我的另一篇博文

easyui實現可擴充套件框架的幾種思路 。

       使用Linq to sql來查詢許可權資料。首先基於Easyui Tree 的格式來構造View Model。  

    //url屬性類
    public class URL
    {
        public string url { get; set; }
    }

    //節點類
  public class Node
    {
        public string text { get; set; }
        public URL attributes { get; set; }
        public string iconCls { get; set; }
    }

    //父節點類
  public class Father
    {
        public string text { get; set; }
        public List<Node> children { get; set; }
    }
      Tree控制元件的attributes屬性就是提供給使用者的一個數據容器,你可以在其中放置各種自定義的資料。

       將聯查得到的許可權資料填充到檢視模型集合中並序列化成Tree控制元件需要的標準格式:  

 public string MenuTree(string userName)
        {
            List<Father> menu = new List<Father>();

            var result = from u in m_CMContext.Users()
                      join ur in m_CMContext.User_Roles() on u.Name equals ur.User_Name
                      join r in m_CMContext.Roles() on ur.Role_Name equals r.Name
                      join f in m_CMContext.Role_Functions() on r.Name equals f.Role_Name
                      join fun in m_CMContext.Functions() on f.Fun_Name equals fun.Name
                      orderby r.Sequence, f.Sequence
                      select new { ur.Role_Name,  fun.Alias,fun.IconCls, fun.URL };
            var g = from c in result group c by c.Role_Name;
            foreach (var i in g)
            {
                menu.Add(new Father());
                Father tempFather = menu[menu.Count - 1];
                tempFather.text = i.Key;
                tempFather.children = new List<Node>();
                foreach (var f in i)
                {
                    tempFather.children.Add(new Node { text = f.Alias, iconCls = f.IconCls, attributes = new URL { url = f.URL } });
                }
            }
            return JsonConvert.SerializeObject(menu);
        }
             組裝Tree資料稍顯繁瑣。最後展現在頁面中的選單如圖:

             

              這裡只為使用者配置了一個稽核角色,稽核角色下有四個許可權,這一切都是從資料庫動態生成的。

              角色的順序、角色中許可權的順序以及圖示和URL路徑都是可以配置的。至此,基於RBAC的許可權選單樹已經實現了全配置。