此系統能滿足一般權限/菜單控制需求,不需要重復開發,達到多系統共用的目的
權限判斷是基於請求路徑,意味着是頁面級控制,可能不符合一些要求,當然你也可以把路徑細化實現
菜單為二級菜單,暫不支持多級
此系統基於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代碼請入群獲取
