权限管理的核心是解决: 谁 能够在哪 进行 什么操作。
这张图的重点是 Users 表, Role表, Action表,Module表。
RoleAction表示改角色拥有的权限。
UserRole表示用户拥有的角色。
UserAction表示用户除了角色权限外拥有的其他权限。
那么,一个用户拥有的权限应该是该用户拥有的角色权限和独立权限的集合
这里有一个支持树形的Module表,他表示系统的目录结构。
Action表中的每一条数据都有Module表示该模块的一个操作
系统目录(数据表支持树,系统目前只有两级菜单)
核心方法
/// <summary>/// 获得某个用户的所有权限 返回一个 ModuleID_ActionName 的数组/// </summary>public string[] getActionsOfUser(string userid){string[] temp= Web.DBUtility.DB.getInstance().getActionsOfUser(userid);return temp;}getActionsOfUser方法的sql语句为string sql_AllActions = string.Format("select a.ModuleID,a.actionName from [role] r inner join userRole ur on r.roleid=ur.roleid inner join roleaction ra "+"on r.roleid=ra.roleid inner join [action] a on ra.actionid=a.actionid inner join users u on ur.userid=u.userid where ur.userid='{0}' "+"and a.state=1 and r.ispublic=1 and u.state=1 union select ModuleID,actionName from [action] ac inner join useraction uc on ac.actionid=uc.actionid "+"inner join users u on uc.userid=u.userid where u.userid='{0}' and u.state=1 and ac.state=1", userid);
/// <summary>/// 获得某个用户的拥有的角色权限/// </summary>/// <param name="userid"></param>/// <returns></returns>public string[] getActionsOfUserRoles(string userid){string[] temp = Web.DBUtility.DB.getInstance().getActionsOfUserRoles(userid);return temp;}/// <summary>/// 判断当前用户是否有某种权限/// </summary>/// <param name="moduleid">操作的模块ID</param>/// <param name="actionName">进行的操作actionName</param>/// <returns></returns>public bool isValidate(string moduleid, string actionName){if (HttpContext.Current.Session["isAdmin"] != null)return true;//UActions--该用户所有的所有权限集合if (UActions.Contains(string.Format("{0}_{1}", moduleid.ToLower(), actionName.ToLower()))){return true;}elsereturn false;}/// <summary>/// 传入pagename,判断页面超链接是否在左边菜单列显示///原则是 一个页面有很多权限(比如增删改查),登录用户只要拥有一个权限(查),则显示/// </summary>/// <param name="pagename"></param>/// <returns></returns>public bool isPageShow(string pagename) {if (isAdmin())return true;bool flag = false;//当前页面的权限集合DataTable dt = getAllActions();DataRow[] drs = dt.Select(string.Format("pagename='{0}'", pagename));if (drs != null && drs.Length > 0){string[] myactions = getActionsOfUser(Common.SessionManager.getInstance().CurrentUID);foreach (DataRow item in drs){if (myactions.Contains(string.Format("{0}_{1}", item["moduleid"].ToString().ToLower(),item["actionName"].ToString().ToLower()))){flag = true;break;}}return flag;}elsereturn false;}/// <summary>/// 传入moduleID,判断模块是否在左边菜单列显示/// </summary>/// <param name="pagename"></param>/// <returns></returns>public bool isModuleShow(string moduleid){if (isAdmin())return true;bool flag = false;DataTable dt = getAllActions();DataRow[] drs = dt.Select(string.Format("moduleid='{0}'", moduleid));if (drs != null && drs.Length > 0){string[] myactions = getActionsOfUser(Common.SessionManager.getInstance().CurrentUID);foreach (DataRow item in drs){if (myactions.Contains(string.Format("{0}_{1}", item["moduleid"].ToString().ToLower(),item["actionName"].ToString().ToLower()))){flag = true;break;}}return flag;}elsereturn false;}