MVC之權限管理-網站開發之路

1、前言javascript

    剛到公司沒多長時間就開始接觸MVC到如今不能說懂了,只能說到達會用這個層次吧,感受MVC用來寫Web仍是很強大的,層次清晰。java

    今天我來寫寫關於權限管理這一塊,自我感受網站的權限主要分爲菜單權限和角色權限,首先說角色權限,比較簡單不一樣角色能夠看到不一樣頁面這就是角色權限,菜單權限也能夠說是操做權限,就是具體到某一個按鈕,或某一個下拉框的查看權限或使用權限。程序員

2、角色權限sql

    1.用戶角色數據庫

    首先來角色權限,每一個用戶有着多樣不一樣的角色,一對多的關係。網站

    

    2.菜單管理ui

    在菜單管理中咱們就能夠這樣管理,某一菜單,那一角色能夠看到就打上√這樣比較容易控制。this

    

    3.數據庫spa

    再來看數據庫中,要有角色的表以及用戶與角色關係表。3d

    

   再就是角色與菜單的關係表,其中PermissionIDs字段爲操做權限以|隔開。

   

   

    4.用戶登陸

    當用戶登陸時咱們就能夠根據登錄人的ID取到他的全部角色存到Session中,並根據登陸人查出相應的菜單。

//角色基本信息
            SqlHelperParameter sqlHelperParameterRole = new SqlHelperParameter();
            sqlHelperParameterRole.Add("UserId", dtUserRow["UserId"].ToString());
            DataTable dtRole = SqlHelper.ExecuteDataTable(@"
            select 
            Sys_Roles.RoleId,
            Sys_Roles.RoleName,
            Sys_Roles.Weight 
            from (
                select UserId,RoleId from Sys_UsersInRoles 
                where UserId =@UserId
            ) as a left join Sys_Roles on a.RoleId = Sys_Roles.RoleId", sqlHelperParameterRole);
            int dtRoleCount = dtRole.Rows.Count;
            RoleWeightMax = int.MaxValue;
            for (int i = 0; i < dtRoleCount; i++)
            {
                RolesSession rs = new RolesSession();
                rs.RoleID = Guid.Parse(dtRole.Rows[i]["RoleId"].ToString());
                rs.RoleName = dtRole.Rows[i]["RoleName"].ToString();
                rs.Weight = Convert.ToInt32(dtRole.Rows[i]["Weight"]);
                if (RoleWeightMax > rs.Weight)
                {
                    RoleWeightMax = rs.Weight;
                }
                RoleList.Add(rs);
            }
public class RolesSession
    {
        public Guid RoleID { get; set; }
        public string RoleName { get; set; }
        //權重
        public int Weight { get; set; }
    }

     前臺代碼:

<div data-options="region:'west',split:true" title="導航菜單" style="width: 200px; padding1: 1px;
    overflow: hidden;" id="left_nav">
    <div class="easyui-accordion" data-options="fit:true,border:false">
        @H9C.PMS.BLL.LogOn.MenuList.GetMenu(ViewBag.UserName)
    </div>
</div>

    控制器:

public static MvcHtmlString GetMenu(string userName)
        {
            Menu menu = new Menu();
            MenuStructure ms = menu.GetMenuListStructure(userName);
            if (ms != null)
            {
                ms.Children.Remove(ms.Children.FirstOrDefault(o => o.ModelCode == "0" && o.ParentID == "0"));
            }
            return new MvcHtmlString(MenuNav("0", ms));
        }

        private static string MenuNav(string menuCode, MenuStructure menuStruc)
        {
            if (menuStruc == null)
            {
                return "<div>沒有可用菜單</div>";
            }
            List<MenuStructure> list = menuStruc.Children.Where(m => m.ParentID == menuCode).ToList();
            StringBuilder sbMenu = new StringBuilder();

            foreach (var item in list)
            {
                if (item.ParentID == "0")
                {
                    sbMenu.Append("<div title=\"" + item.Title + "\" style=\"overflow: auto;\">");
                    sbMenu.Append("<ul id=\"menu" + item.ParentID + "\" class=\"easyui-tree\" animate=\"true\" dnd=\"true\">");
                    sbMenu.Append("<li>");

                }
                else
                {
                    sbMenu.Append("<ul id=\"menu" + item.ParentID + "\" class=\"easyui-tree\" animate=\"true\" dnd=\"true\">");
                    if (item.Children.Count == 0)
                    {
                        sbMenu.Append("<li>");
                    }
                    else
                    {
                        sbMenu.Append("<li state=\"closed\">");
                    }
                }

                sbMenu.Append("<span>");

                if (item.Url == "/")
                {
                    sbMenu.Append("<a class=\"e-submenu\" href=\"javascript:void(0);\" title=\"" + item.Title + "\" >");
                }
                else
                {
                    string tabsIcon = "14";
                    if (!string.IsNullOrWhiteSpace(item.Icon))
                    {
                        tabsIcon = item.Icon.Replace("/Content/images/", "").Replace(".png", "");
                    }
                    sbMenu.Append("<a class=\"e-submenu\" href=\"#\" onclick=\"addTab('" + item.Url + "','" + item.Title + "')\" >");
                    sbMenu.Append("<img src=\"" + item.Icon + "\" >");
                }

                sbMenu.Append("" + item.Title + "");
                sbMenu.Append("</a></span>");
                if (IsExistParent(item.ModelCode, item))
                {
                    sbMenu.Append(MenuNav(item.ModelCode, item));
                }
                sbMenu.Append("</li>");
                sbMenu.Append("</ul>");


                if (item.ParentID == "0")
                {
                    sbMenu.Append("</div>");
                }

            }
            return sbMenu.ToString();
        }

        private static bool IsExistParent(string modelCode, MenuStructure menuModels)
        {
            var query = menuModels.Children.FirstOrDefault(m => m.ParentID == modelCode);
            if (query == null)
            {
                return false;
            }
            return true;
        }

    菜單類:

public class MenuStructure
    {
        public string ModelCode;
        public string Title;
        public string Icon;
        public string Url;
        public string ParentID;
        public List<MenuStructure> Children = new List<MenuStructure>();
    }

    其中GetMenuListStructure()方法就是根據用戶名獲取菜單列表結構,我這裏用戶名在數據庫中是惟一的,在這裏注意一點比較麻煩的是根據類能夠看出菜單是有父菜單子菜單的因此方法中須要有兩個循環去添加。

    三、菜單權限

    也就是操做權限,好比某一按鈕的操做權限。首先咱們把全部關於按鈕的操做權限存放到一個類中,(有更好的方法請向我推薦謝謝)

    

public class Menus
    {
        public static int gongdan = 503000000;//任務工單
    }

    而後咱們須要操做權限的按鈕所在的頁面的Controllers(加載頁面)中存到ViewBag裏,以下:

public ActionResult Index()
        {
H9C.PMS.BLL.RBAC.Permission pm = new BLL.RBAC.Permission(); ViewBag.IsReportPlan
= pm.IsRoleHavePermissions(Roles.Shigongduizhang, Menus.gongdan, base.UserSessionModel, Menus.GongdanReportPlanByShiGongTeamer); //上報施工計劃 return View(); }
/// <summary>
        /// 判斷某權限是否在獲取某角色權限的列表中
        /// </summary>
        /// <param name="roleId"></param>
        /// <param name="modelCode"></param>
        /// <param name="userSessionModel"></param>
        /// <param name="permissionCode"></param>
        /// <returns></returns>
        public bool IsRoleHavePermissions(Guid roleId, int modelCode, UserSessionModel userSessionModel, int permissionCode)
        {
            List<PermissionModel> permissionModelList = this.GetRolePermissionList(roleId, modelCode, userSessionModel);
            if (permissionModelList == null)
            {
                return false;
            }
            foreach (var o in permissionModelList)
            {
                if (o.PCode == permissionCode)
                {
                    return true;
                }
            }
            return false;
        }
/// <summary>
        /// 獲取某角色權限的列表
        /// </summary>
        /// <param name="roleId"></param>
        /// <param name="modelCode"></param>
        /// <param name="userSessionModel"></param>
        /// <returns></returns>
        public List<PermissionModel> GetRolePermissionList(Guid roleId, int modelCode, UserSessionModel userSessionModel)
        {
            foreach (var o in userSessionModel.RoleList)
            {
                if (o.RoleID == roleId)
                {
                    List<Model.RBAC.PermissionModel> permissionList = this.PermissionList(roleId, modelCode);
                    return permissionList;
                }
            }
            return null;
        }
/// <summary>
        /// 獲取某菜單某角色下具備的權限
        /// </summary>
        /// <param name="modelId"></param>
        /// <param name="menuId"></param>
        /// <returns></returns>
        public List<PermissionModel> PermissionList(Guid roleId, int menuId)
        {
            List<PermissionModel> pmList = new List<PermissionModel>();
            using (RBACContext connEF = new RBACContext())
            {
                Sys_Role_Model_Permissions srmp = connEF.Sys_Role_Model_Permissions.FirstOrDefault(o => o.ModelID == menuId && o.RoleId == roleId);
                if (srmp != null)
                {
                    string permissions = srmp.PermissionIDs;
                    if (!string.IsNullOrWhiteSpace(permissions))
                    {
                        string[] pids = permissions.Split(new char[] { '|' });
                        for (int i = 0; i < pids.Length; i++)
                        {
                            if (!string.IsNullOrWhiteSpace(pids[i]))
                            {
                                pmList.Add(new PermissionModel() {
                                    ModelCode = menuId,
                                    PCode = Convert.ToInt32(pids[i]),
                                    PName =""
                                });
                            }
                        }
                    }
                }
            }
            return pmList;
        }

    最後一個方法中運用到了EF根據菜單以及角色獲取某菜單某角色下具備的權限

    前臺就很是簡單的:

@if (ViewBag.IsReportPlan == true)
        {
            @:&nbsp;&nbsp;
             <a href="#" class="easyui-linkbutton l-btn"
                 iconcls="icon-add">按鈕</a> 
        }

    4、尾聲

    總結一下,就是首先要有一個菜單管理的模塊,它不但能夠管理菜單還能夠管理菜單中的權限以及每一個角色關於菜單的權限,而後就是後臺的控制,上面權限Model中存的權重,指的是每一角色都有權重,每個用戶都有他的最大權重,根據這個權重咱們就能夠作不少條件的控制,簡單的說也是爲了方便吧。

    第一篇技術文檔,文筆還須要多鍛鍊,之後會試着多寫博文,不會寫文檔的碼農不是好程序員。

相關文章
相關標籤/搜索