基于URL的权限把持 ASP.NET MVC中的实现(2)
这个信息每个用户是不同的,但是会经常应用到,所以存入Session。
1/**//// <summary>
2/// 获取用户权限
3/// </summary>
4/// <param name="userID">用户ID</param>
5/// <returns>用户权限数组</returns>
6public static Int32[] GetUserPermission(int userID)
7{
8 // 如果缓存中已经存在权限列表信息,则直接从缓存中读取。
9 if (HttpContext.Current.Session["Permission"] == null)
10 {
11 // 从数据库获取用户权限并将权限ID放到int数组并存入Session
12 UrlAuthorizeEntities db = new UrlAuthorizeEntities();
13 var permissions = db.PermissionList.Where(c => c.UserID == userID).Select(c=>c.PermissionID).ToArray();
14 HttpContext.Current.Session["Permission"] = permissions;
15 }
16 return (Int32[])HttpContext.Current.Session["Permission"];
17}
18再新建一个UrlAuthorizeAttribute类,继承自AuthorizeAttribute,这是一个Filter。我们重写它的OnAuthorization法子 ,以在ASP.NET页生命 周期身份验证阶段履行它。
1/**//// <summary>
2/// 重写OnAuthorization
3/// </summary>
4/// <param name="filterContext"></param>
5public override void OnAuthorization(AuthorizationContext filterContext)
6{
7 // 获取权限项列表
8 List<PermissionItem> pItems = AccountHelper.GetPermissionItems();
9
10 // 获取当前造访 页面对应的权限ID。如果item为空则表现 当前页面没有权限把持 信息,不需要 进行权限把持
11 var item = pItems.FirstOrDefault(c => c.Route == filterContext.HttpContext.Request.Path);
12
13 if (item != null)
14 {
15 if (Array.IndexOf<Int32>(AccountHelper.GetUserPermission(int.Parse(filterContext.HttpContext.Session["UserID"].ToString())), item.PermissionID) == -1)
16 {
17 // 提示 权限不够,也可以跳转到其他页面
18 filterContext.HttpContext.Response.Write("没有权限造访 该页面");
19 filterContext.HttpContext.Response.End();
20 }
21 }
22 else
23 {
24 // 如果权限项列表中不存在当前页面对应的权限ID则所有用户都不容许 造访 ,直接提示 无权造访 。***注1***
25 filterContext.HttpContext.Response.Write("没有权限造访 该页面");
26 filterContext.HttpContext.Response.End();
27 }
28}
29至此,首要的工作都已经完成了的。接下来我们只需要 在需要 进行基于URL权限把持的Action或Controller前加上[UrlAuthorize],这些Action或Controller中的所有Actions就会主动被UrlAuthorize这个Filter进行处理 。
补充:Web开发 , ASP.Net ,