CRL通用權限控制系統


此系統能滿足一般權限/菜單控制需求,不需要重復開發,達到多系統共用的目的

權限判斷是基於請求路徑,意味着是頁面級控制,可能不符合一些要求,當然你也可以把路徑細化實現

菜單為二級菜單,暫不支持多級

此系統基於CRL框架內置業務開發,CRL框架詳細信息

運行環境 .Net Mvc4 默認數據庫MSSQL

此權限系統主要概念

  • 系統(屬於哪個系統,分平台進行權限控制)
  • 菜單(跟系統掛鈎,此系統有哪些菜單)
  • 角色(有哪些角色)
  • 用戶(有哪些用戶,跟角色掛鈎)
  • 權限(角色或用戶有哪些菜單的權限)

菜單

菜單結構如下,主要屬性

  • 名稱
  • 路徑(菜單訪問路徑)
  • 導航顯示(是否在菜單列表顯示)
  • 是否禁用

菜單子級

角色

角色權限

用戶

用戶權限

用戶權權限繼承角色權限,只會多,不會少,繼承的權限不能更改

設置好這些,權限系就能正常工作了,需要進行權限控制的項目需要部署權限控制,菜單效果如下

布署權限控制,以MVC為例

  登錄

  因為用戶是在權限系統里,所以登錄也由權限系統來提供  

public ActionResult Login(string userName, string passWord, string verifyCode)
        {
            string error;
            
            bool a = CRL.RoleAuthorize.EmployeeBusiness.Instance.CheckPass(userName, passWord, out error);//驗證密碼
            if (!a)
            {
                ModelState.AddModelError("", error);
                return View();
            }

            var u = CRL.RoleAuthorize.EmployeeBusiness.Instance.QueryItem(b => b.AccountNo == userName);
            CRL.RoleAuthorize.EmployeeBusiness.Instance.Login(u, "admin", false);//FORM 驗證登錄
            CRL.RoleAuthorize.MenuBusiness.Instance.RemoveUserMenuCache(u.Id, 2);//清除用戶菜單緩存
            string returnUrl = Request["returnUrl"];
            if (string.IsNullOrEmpty(returnUrl))
            {
                returnUrl = "/";
            }
            return Redirect(returnUrl);
        }

  布署菜單

  登錄后需要顯示當前用戶可用菜單

  獲取菜單分組

var menus = new Dictionary<CRL.RoleAuthorize.Menu, List<CRL.RoleAuthorize.Menu>>();
    string url = System.Web.HttpContext.Current.Request.Url.PathAndQuery.ToLower();

    var currentUser = CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser;//獲取當前登錄用戶
  //獲取系統編號為1的菜單,注意改這里 menus
= CRL.RoleAuthorize.MenuBusiness.Instance.GetUserMenuByGroup(CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser.Id, 1);

  顯示菜單

@foreach (var item in menus.Keys)//循環主菜單
{
    var childs = menus[item];
    <h2>@item.Name</h2>
    <ul>
    @foreach (var item2 in childs)//子菜單
    {
        if (!item2.ShowInNav)//不在導航顯示則跳過
        {
            continue;
        }
        <li>
            <a href="@item2.Url"  title="@item2.Name">@item2.Name</a>
        </li>
    }
        </ul>
}

  實現權限控制

  MVC路徑都是基於控制器的,很好控制,在基類實現權限檢測方法  

/// <summary>
        /// 對應當前系統ID
        /// </summary>
        int currentSystemId = 1;
/// <summary>
        /// 當前登錄用戶
        /// </summary>
        public CRL.Person.IPerson CurrentUser
        {
            get
            {
                return CRL.RoleAuthorize.EmployeeBusiness.Instance.CurrentUser;
            }
        }
 /// <summary>
        /// 訪問權限檢查,按當前請求路徑
        /// </summary>
        /// <returns></returns>
        public bool CheckAccess()
        {
            bool a = CRL.RoleAuthorize.AccessControlBusiness.Instance.CheckAccess(currentSystemId, CurrentUser.Id);
            return a;
        }

  在控制器方法里調用該方法

public ActionResult Update()
        {
            if (!CheckAccess())
            {
                return Content("沒有權限");
            }
            return Content("訪問成功");
        }

到這里,權限系統就能正常工作了,由於使用了緩存,菜單查找效率非常高,可能會造成菜單不同步的情況,需要清空緩存

項目里自帶了一個測試項目,更改項目里DBConnection文件夾,.config數據連接文件,連接正確的SQL數據庫

運行RoleControl項目,登錄 用戶名:admin 密碼:admin (如需更改,更改/config/CustomSetting.config) 加入測試菜單

運行RoleControlWebTest 登錄 用戶名:test 密碼:test

項目下載地址: 百度盤

最新3.0代碼請入群獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM