成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談基于URL的權(quán)限控制ASP.NET MVC中的實(shí)現(xiàn)

開發(fā) 后端
本示例演示了在ASP.NET MVC中進(jìn)行基于URL的權(quán)限控制,由于是基于URL進(jìn)行控制的,所以只能精確到頁。這種權(quán)限控制的優(yōu)點(diǎn)是可以在已有的項(xiàng)目上改動(dòng)極少的代碼來增加權(quán)限控制功能,和項(xiàng)目本身的耦合度低,并且實(shí)現(xiàn)起來也比較簡單。缺點(diǎn)是權(quán)限控制不夠精確,不能具體到某一具體的按鈕或者某一功能。

淺談基于URL的權(quán)限控制ASP.NET MVC中的實(shí)現(xiàn)

在數(shù)據(jù)庫中新建2個(gè)表。PermissionItem表用于保存權(quán)限ID和頁面路徑的關(guān)系,一個(gè)權(quán)限ID可以有多個(gè)頁面,一般同一個(gè)權(quán)限ID下的頁面是為了實(shí)現(xiàn)同一個(gè)功能。PermissionList表用于保存用戶所具有的權(quán)限。

  1. Code  
  2. USE [UrlAuthorize]  
  3. GO  
  4. /****** Object:  Table [dbo].[PermissionList]    Script Date: 07/07/2009 00:07:10 ******/  
  5. SET ANSI_NULLS ON  
  6. GO  
  7. SET QUOTED_IDENTIFIER ON  
  8. GO  
  9. CREATE TABLE [dbo].[PermissionList](  
  10.     [ID] [int] IDENTITY(1,1) NOT NULL,  
  11.     [PermissionID] [int] NOT NULL,  
  12.     [UserID] [int] NOT NULL,  
  13.  CONSTRAINT [PK_PermissionList] PRIMARY KEY CLUSTERED   
  14. (  
  15.     [ID] ASC  
  16. )WITH (PAD_INDEX  = OFFSTATISTICS_NORECOMPUTE  = OFFIGNORE_DUP_KEY = OFFALLOW_ROW_LOCKS  = ONALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
  17. ) ON [PRIMARY]  
  18. GO  
  19. SET IDENTITY_INSERT [dbo].[PermissionList] ON  
  20. INSERT [dbo].[PermissionList] ([ID], [PermissionID], [UserID]) VALUES (1, 2, 1)  
  21. INSERT [dbo].[PermissionList] ([ID], [PermissionID], [UserID]) VALUES (2, 3, 1)  
  22. SET IDENTITY_INSERT [dbo].[PermissionList] OFF  
  23. /****** Object:  Table [dbo].[PermissionItem]    Script Date: 07/07/2009 00:07:10 ******/  
  24. SET ANSI_NULLS ON  
  25. GO  
  26. SET QUOTED_IDENTIFIER ON  
  27. GO  
  28. SET ANSI_PADDING ON  
  29. GO  
  30. CREATE TABLE [dbo].[PermissionItem](  
  31.     [ID] [int] IDENTITY(1,1) NOT NULL,  
  32.     [PermissionID] [int] NOT NULL,  
  33.     [Name] [nvarchar](50) NOT NULL,  
  34.     [Route] [varchar](100) NOT NULL,  
  35.  CONSTRAINT [PK_PermissionItem] PRIMARY KEY CLUSTERED   
  36. (  
  37.     [ID] ASC  
  38. )WITH (PAD_INDEX  = OFFSTATISTICS_NORECOMPUTE  = OFFIGNORE_DUP_KEY = OFFALLOW_ROW_LOCKS  = ONALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
  39. ) ON [PRIMARY]  
  40. GO  
  41. SET ANSI_PADDING OFF  
  42. GO  
  43. SET IDENTITY_INSERT [dbo].[PermissionItem] ON  
  44. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (1, 1, N'測試頁1', N'/Test/Page1')  
  45. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (2, 2, N'測試頁2', N'/Test/Page2')  
  46. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (3, 3, N'測試頁3', N'/Test/Page3')  
  47. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (5, 1, N'測試頁4', N'/Test/Page4')  
  48. INSERT [dbo].[PermissionItem] ([ID], [PermissionID], [Name], [Route]) VALUES (6, 2, N'測試頁5', N'/Test/Page5')  
  49. SET IDENTITY_INSERT [dbo].[PermissionItem] OFF 

權(quán)限

數(shù)據(jù)庫中的示例表示Page1和Page4同屬于權(quán)限1,Page2和Page5同屬于權(quán)限2,Page3屬于權(quán)限3。用戶ID為1的用戶具有權(quán)限2和3。

在ASP.NET MVC項(xiàng)目中新建一個(gè)AccountHelper類,這是一個(gè)輔助類。GetPermissionItems方法用于獲取權(quán)限ID和頁面路徑的對應(yīng)關(guān)系。這是全局的,并且每個(gè)用戶在訪問頁面時(shí)都會(huì)用到這些信息,所以存入Cache中。數(shù)據(jù)庫的相關(guān)操作這里使用的是ADO.NET Entity Framework。

 1/**//// <summary>
 2/// 獲取權(quán)限項(xiàng)
 3/// </summary>
 4/// <returns>權(quán)限項(xiàng)列表</returns>
 5public static List<PermissionItem> GetPermissionItems()
 6{
 7     // 如果緩存中已經(jīng)存在權(quán)限列表信息,則直接從緩存中讀取。
 8      if (HttpContext.Current.Cache["PermissionItems"] == null)
 9     {
10          // 如果緩存中沒有權(quán)限列表信息,則從數(shù)據(jù)庫獲取并寫入緩存
11           UrlAuthorizeEntities db = new UrlAuthorizeEntities();
12          var items = db.PermissionItem.Where(c => c.PermissionID > 0).ToList();
13          HttpContext.Current.Cache["PermissionItems"] = items;
14     }
15
16     // 這個(gè)緩存中保存了所有需要進(jìn)行權(quán)限控制的頁面所對應(yīng)的權(quán)限ID
17     return (List<PermissionItem>)HttpContext.Current.Cache["PermissionItems"];
18}
19

GetUserPermission方法是將用戶所具有的權(quán)限ID保存到一個(gè)一維Int32數(shù)組中。這個(gè)信息每個(gè)用戶是不同的,但是會(huì)經(jīng)常使用到,所以存入Session。

1/**//// <summary>
 2/// 獲取用戶權(quán)限
 3/// </summary>
 4/// <param name="userID">用戶ID</param>
 5/// <returns>用戶權(quán)限數(shù)組</returns>
 6public static Int32[] GetUserPermission(int userID)
 7{
 8    // 如果緩存中已經(jīng)存在權(quán)限列表信息,則直接從緩存中讀取。
 9    if (HttpContext.Current.Session["Permission"] == null)
10    {
11        // 從數(shù)據(jù)庫獲取用戶權(quán)限并將權(quán)限ID放到int數(shù)組并存入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

再新建一個(gè)UrlAuthorizeAttribute類,繼承自AuthorizeAttribute,這是一個(gè)Filter。我們重寫它的OnAuthorization方法,以在ASP.NET頁生命周期身份驗(yàn)證階段執(zhí)行它。

1/**//// <summary>
 2/// 重寫OnAuthorization
 3/// </summary>
 4/// <param name="filterContext"></param>
 5public override void OnAuthorization(AuthorizationContext filterContext)
 6{
 7    // 獲取權(quán)限項(xiàng)列表
 8    List<PermissionItem> pItems = AccountHelper.GetPermissionItems();
 9
10    // 獲取當(dāng)前訪問頁面對應(yīng)的權(quán)限ID。如果item為空則表示當(dāng)前頁面沒有權(quán)限控制信息,不需要進(jìn)行權(quán)限控制
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            // 提示權(quán)限不夠,也可以跳轉(zhuǎn)到其他頁面
18            filterContext.HttpContext.Response.Write("沒有權(quán)限訪問該頁面");
19            filterContext.HttpContext.Response.End();
20        }
21    }
22    else
23    {
24        // 如果權(quán)限項(xiàng)列表中不存在當(dāng)前頁面對應(yīng)的權(quán)限ID則所有用戶都不允許訪問,直接提示無權(quán)訪問。***注1***
25        filterContext.HttpContext.Response.Write("沒有權(quán)限訪問該頁面");
26        filterContext.HttpContext.Response.End();
27    }
28}
29

至此,主要的工作都已經(jīng)完成了的。接下來我們只需要在需要進(jìn)行基于URL權(quán)限控制的Action或Controller前加上[UrlAuthorize],這些Action或Controller中的所有Actions就會(huì)自動(dòng)被UrlAuthorize這個(gè)Filter進(jìn)行處理。如果某一個(gè)Action被標(biāo)上了[UrlAuthorize],而數(shù)據(jù)庫中又不存在該頁面對應(yīng)的權(quán)限ID,那么根據(jù)示例的代碼,所有用戶都將無法訪問這個(gè)頁面,如果需要更改這個(gè)設(shè)置,可以修改上面“注1”下面的2行代碼。

【編輯推薦】

  1. ASP.NET的錯(cuò)誤處理機(jī)制
  2. ASP.NET多附件上傳和附件編輯的實(shí)現(xiàn)
  3. ASP.NET中性能和擴(kuò)展性的秘密
  4. ASP.NET 3.5圖表控件親密接觸
  5. 詳解ASP.NET的四種狀態(tài)
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2009-12-21 10:05:10

ASP.NET MVC

2009-12-07 09:23:05

ASP.NET MVC

2009-09-24 09:26:22

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-20 12:42:04

MvcContrib.ASP.NET MVC

2009-06-15 10:57:51

FluentHtmlASP.NET MVC

2009-07-27 13:01:28

TreeViewASP.NET

2009-07-24 11:20:43

ASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-01-04 13:27:10

URL RewriteIISASP.NET

2009-07-31 09:58:20

URL映射ASP.NET

2009-07-28 14:47:18

ASP.NET MVC

2011-01-28 09:45:29

ASP.NET MVC

2009-07-22 13:16:04

MvcAjaxPaneASP.NET MVC

2009-07-22 14:23:39

URL RewriteASP.NET

2009-07-23 16:28:20

URL映射ASP.NET 2.0

2009-09-10 09:50:47

ASP.NET MVC

2009-01-16 13:17:16

AjaxASP.NET.NET

2009-06-01 10:23:31

asp.net mvcasp.net mvc.net mvc框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲欧美激情精品一区二区 | 国产98色在线 | 日韩 | 免费一级片| 欧美一级高潮片免费的 | 欧日韩不卡在线视频 | 91免费高清| 欧美精品一区二区三区蜜桃视频 | 日本成人在线网址 | 精品久久国产 | 中文字幕在线电影观看 | 四虎影视在线 | 一级做a爰片久久毛片免费看 | 一区二区三区免费看 | 激情av免费看 | 亚洲国产精品人人爽夜夜爽 | 欧美乱码精品一区二区三区 | 午夜精品久久久久久久久久久久久 | 成人免费视频观看视频 | 久久免费精品视频 | 国产视频中文字幕在线观看 | 亚洲精品一区二区另类图片 | 午夜欧美一区二区三区在线播放 | 毛片com| 久久久精品国产 | 国产一区二区三区色淫影院 | 日韩av成人在线观看 | 亚洲精品福利视频 | hdfreexxxx中国妞 | 美女爽到呻吟久久久久 | 午夜视频一区 | 国产精彩视频 | 日韩无| 成年人精品视频在线观看 | 国产精品久久久久久久久大全 | 99热播精品 | 韩日在线观看视频 | 国产剧情一区二区三区 | 日韩av一区二区在线观看 | 亚洲国产精品一区二区www | 精品久久久久久亚洲综合网 | 成人性视频免费网站 |