菜單權限和非菜單權限過濾

1、首先過濾菜單權限html

一. 此處是基於ligerUl框架的前端展現實現的菜單權限過濾,實現的步驟都大同小異,重點是本篇實現的思想。
前端

1. 註釋掉本來固定的菜單展現後端

 

2. 向後端發送一個getJSON異步請求安全

 

 //發送異步請求,請求的控制器和請求的方法,請求的參數,返回的參數,而且將返回的參數賦值給links
    $.getJSON("/Home/Getmenus", {}, function (data) {
        links = data;
        linksInit();
        onResize();
    })

3. 寫Getmenus方法對應的內容cookie

該方法中具體須要實現以下:session

a. 首先按照用戶-角色-權限查找菜單權限,放在一個集合中框架

b. 按照用戶-權限查找菜單權限,放在一個集合中異步

c. 將兩個集合合併成一個集合ide

d . 將禁止的集合從中清除出去url

e. 將重複的清除出去

g. 把過濾好的集合返回到前端

IBLL.IUserInfoService UserInfoService { get; set; }  //首先構建出該類的實例 

#region 過濾登陸用戶的菜單權限 /// <summary> /// 1: 能夠按照用戶---角色---權限這條線找出登陸用戶的權限,放在一個集合中。 /// 2:能夠按照用戶---權限這條線找出用戶的權限,放在一個集合中。 /// 3:將這兩個集合合併成一個集合。 /// 4:把禁止的權限從總的集合中清除。 /// 5:將總的集合中的重複權限清除。 /// 6:把過濾好的菜單權限生成JSON返回。 /// </summary> /// <returns></returns> public ActionResult Getmenus() { //1: 能夠按照用戶---角色---權限這條線找出登陸用戶的權限,放在一個集合中。 //獲取登陸用戶的信息 var userInfo = UserInfoService.LoadEntities(u => u.ID == Loginuser.ID).FirstOrDefault(); //獲取登陸用戶的角色. var userRoleInfo = userInfo.RoleInfo; //根據登陸用戶的角色獲取對應的菜單權限。 short actionTypeEnum = (short)ActionTypeEnum.MenumActionType; var loginUserMenuActions = (from r in userRoleInfo from a in r.ActionInfo where a.ActionTypeEnum == actionTypeEnum select a).ToList(); //下面語句是錯誤的,allUserActions是一個大集合該集合中包含了不少小的集合,因此變量b爲集合類型 //var allUserActions = from r in userRoleInfo // select r.ActionInfo; //var mm = from b in allUserActions // where b.ActionTypeEnum == actionTypeEnum // select b; // 2:能夠按照用戶---權限這條線找出用戶的權限,放在一個集合中。 var userActions = from a in userInfo.R_UserInfo_ActionInfo select a.ActionInfo; var userMenuActions = (from a in userActions where a.ActionTypeEnum == actionTypeEnum select a).ToList(); // a.ActionInfo不是一個集合,注意理解權限表與用戶權限關係表之間的對應關係 //var userMenuActionse = from a in userInfo.R_UserInfo_ActionInfo // from b in a.ActionInfo // where b.ActionTypeEnum == actionTypeEnum // select b; //3:將這兩個集合合併成一個集合。 loginUserMenuActions.AddRange(userMenuActions); //4:把禁止的權限從總的集合中清除。 //查詢出禁止的 var forbidActions = (from a in userInfo.R_UserInfo_ActionInfo where a.IsPass == 0 select a.ActionInfoID).ToList(); //過濾查詢出不包含禁止的,此處須要些一個方法 var loginUserAllowActions = loginUserMenuActions.Where(a => !forbidActions.Contains(a.ID)); //5:將總的集合中的重複權限清除。,此處須要單獨寫一個方法,方法的內容以下。 var lastLoginUserActions = loginUserAllowActions.Distinct(new EqualityComparer()); //6:把過濾好的菜單權限生成JSON返回。 var temp = from a in lastLoginUserActions select new { icon = a.MenuIcon, title = a.ActionInfoName, url = a.Url }; return Json(temp, JsonRequestBehavior.AllowGet); //此處返回一個temp,與指明只提交get的請求。 } #endregion

上方去重的時候,須要單獨寫一個該方法

namespace Model
{
    public class EqualityComparer:IEqualityComparer<ActionInfo>
    {
        public bool Equals(ActionInfo x, ActionInfo y)
        {
            return x.ID == y.ID;
        }

        public int GetHashCode(ActionInfo obj)
        {
            return obj.GetHashCode();
        }
    }
}

這樣就過濾成功了,可是這樣尚未完,由於若是用戶知道某一個菜單中的子菜單,直接輸入子菜單對應的地址,仍是會進入菜單中,因此這樣仍是不安全,那麼就須要再作下方的步驟。

就是在baseCollections中實現非菜單權限的過濾,實現的步驟就是根據登陸用戶,與請求的方式與請求的地址,而且根據用戶,角色,權限,與用戶,權限兩條線去查詢條件查詢是否知足。而且baseCollections是全部控制器的基類,每次執行以前都會執行該類。

using IBLL;
using Model;
using Spring.Context;
using Spring.Context.Support;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace OA_MVC.Controllers
{
    public class BaseController : Controller
    {
        public UserInfo Loginuser { get; set; }
        /// <summary>
        /// 控制器每次執行以前會先執行該方法
        /// </summary>
        /// <param name="filterContext"></param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            bool isSucess = false;
            if (Request.Cookies["sessionId"] != null)
            {
                //首先獲取到Memcache對應的cookies值。
                string sessionId = Request.Cookies["sessionId"].Value;
                object obj = Common.MemcacheHelper.Get(sessionId);
                if (obj != null)
                {
                    //UserInfo userinfo = obj as UserInfo;
                    UserInfo userinfo = Common.SerializeHelper.DeserializeToObject<UserInfo>(obj.ToString());
                    Loginuser = userinfo;
                    isSucess = true;
                    Common.MemcacheHelper.Set(sessionId, obj, DateTime.Now.AddMinutes(20));//模擬滑動過時時間

                    //今後處開始,完成權限校驗。
                    //獲取用戶請求的URL地址.
                    //若是是Request.Url獲取到的是http://localhost:40008/Home/home
                    //可是Request.Url.AbsolutePath獲取到的是/Home/home  
                    string url = Request.Url.AbsolutePath.ToLower();
                    //獲取請求的方式.
                    string httpMehotd = Request.HttpMethod;
                    //根據獲取的URL地址與請求的方式查詢權限表。
                    IApplicationContext ctx = ContextRegistry.GetContext();
                    IBLL.IActionInfoService ActionInfoService = (IBLL.IActionInfoService)ctx.GetObject("ActionInfoService");
                    var actionInfo = ActionInfoService.LoadEntities(a => a.Url == url && a.HttpMethod == httpMehotd).FirstOrDefault();

                    //判斷用戶是否具備所訪問的地址對應的權限
                    IUserInfoService UserInfoService = (IUserInfoService)ctx.GetObject("UserInfoService");
                    var loginUserInfo = UserInfoService.LoadEntities(u => u.ID == Loginuser.ID).FirstOrDefault();
                    //1:能夠先按照用戶權限這條線進行過濾。
                    var isExt = (from a in loginUserInfo.R_UserInfo_ActionInfo
                                 where a.ActionInfoID == actionInfo.ID
                                 select a).FirstOrDefault();
                    if (isExt != null)
                    {
                        if (isExt.IsPass == 1)
                        {
                            return;
                        }
                        else
                        {
                            filterContext.Result = Redirect("/Error.html");
                            return;
                        }
                    }
                    //2:按照用戶角色權限這條線進行過濾。
                    var loginUserRole = loginUserInfo.RoleInfo;
                    var count = (from r in loginUserRole
                                 from a in r.ActionInfo
                                 where a.ID == actionInfo.ID
                                 select a).Count();
                    if (count < 1)
                    {
                        filterContext.Result = Redirect("/Error.html");
                        return;
                    }
                    //到此處結束
                }

            }
            if (!isSucess)
            {
                filterContext.Result = Redirect("/Login/Index");
            }
        }

    }
}
相關文章
相關標籤/搜索