第一步:設置屬性
namespace ZSZ.Admin.Web.App_Start
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] //只能標記在方法上面,可以同時有多個標記存在
public class CheckPermissionAttribute : Attribute
{
public string Name { get; set; }
public CheckPermissionAttribute(string name)
{
this.Name = name;
}
}
}
第二步:設置權限過濾器
(一共分爲四種情況。session爲NULL的不管是不是ajax請求造成的,都要退回登錄頁面,session保存了用戶信息的時候,就要檢查該用戶是否有某種權限。回覆ajax請求和非ajax請求的方法不一樣)
namespace ZSZ.Admin.Web.App_Start
{
public class ZSZAuthorizationFilter : IAuthorizationFilter
{
public IAdminUserService AdminUser { get; set; }
//每個action執行之前都會執行次方法
public void OnAuthorization(AuthorizationContext filterContext)
{
//0:先獲取要執行的action上面的attribute標記
//1:看是否登錄,沒有登錄就返回登錄頁面,登錄的話在做後續的判斷
//2:後續的判斷就是看有沒有執行此action的權限
CheckPermissionAttribute[] checkPermissions = (CheckPermissionAttribute[])filterContext.ActionDescriptor.GetCustomAttributes(typeof(CheckPermissionAttribute), false);//獲取所有標記的特性
if (checkPermissions.Length <= 0)
{
//說明沒有標記任何特性
return;//跳出過濾器,繼續執行後續的action
}
//取出session的值,看是否爲null
long? loginID = (long?)filterContext.HttpContext.Session["LoginID"];
if (loginID == null)
{
//說明未登錄,返回登錄頁面
//思考:如何判斷請求是來自form提交請求還是ajax請求,進而做不同的處理
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
//這是AJAX請求
AjaxResult aj = new AjaxResult();
aj.Data = "/main/Login";
aj.Status = "redirect";
aj.ErrorMsg = "用戶未登錄";
//filterContext.Result只要被賦值,就不會再繼續執行原本想要執行的action,而是會返回result的結果
filterContext.Result = new JsonResult() { Data = aj };
}
else
{
//表單請求
filterContext.Result = new RedirectResult("~/Main/login");
}
}
else
{
AdminUser = new AdminUserService();//獲取接口實現類的對象
//推薦下面的用法:
//由於ZSZAuthorizeFilter不是被autofac創建,因此不會自動進行屬性的注入
//需要手動獲取Service對象
//IAdminUserService userService =
// DependencyResolver.Current.GetService<IAdminUserService>();
//已登錄。做權限的判斷
foreach (var permAtt in checkPermissions)
{
//判斷當前登錄用戶是否具有permAtt.Permission權限
//(long)userId userId.Value
if (!AdminUser.HavePermissions(loginID.Value, permAtt.Name))
{
//只要碰到任何一個沒有的權限,就禁止訪問
//在IAuthorizationFilter裏面,只要修改filterContext.Result
//那麼真正的Action方法就不會執行了
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
AjaxResult ajaxResult = new AjaxResult();
ajaxResult.Status = "error";
ajaxResult.ErrorMsg = "沒有權限" + permAtt.Name;
filterContext.Result = new JsonResult { Data = ajaxResult };
}
else
{
filterContext.Result
= new ContentResult { Content = "沒有" + permAtt.Name + "這個權限" };
}
return;
}
}
}
}
}
}
第三步:在global.asax註冊
GlobalFilters.Filters.Add(new ZSZAuthorizationFilter()); //增加權限判斷的處理器
第四步:在controller的action上標記屬性
[CheckPermission("lookAdmin")]
public ActionResult Index()
{
var listAdmin = AdminUserService.GetAll();
return View(listAdmin);
}