




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、在MVC中,我們可以通過在action或者controller上設(shè)置AuthorizeRole="xxx" 的方式來設(shè)置用戶對action的訪問權(quán)限。顯然,這樣并不能滿足我們的需求,對于一般的MVC系統(tǒng)來說,如果我們定義一個controller來處理一個模塊的話,我們大致有以下需求:一,單個action的訪問權(quán)限。如果刪除,列表action二,一個action兩種權(quán)限,如edit(int? id)如果id為null則添加,或者修改三,在此cotroller驗證其它模塊權(quán)限,比如,我們要在新聞模塊獲取新聞列表四,對于某些通過模塊,如分類,我們希望通過傳入不同的參數(shù)可以驗證不同
2、模塊的權(quán)限對于四種情況,我理想的想法是:對于第一種,直接制定controller的moduleid和action的權(quán)限 Module(ModuleId=6)public class Controller: Controller SysAuthorize(Permission.List) /設(shè)置action要驗證的權(quán)限 public ActionResult List() 對于第二種情況,我們希望通過參數(shù)來達到驗證那個權(quán)限的目的: Module(ModuleId=6) public class Controller: Controller /如果參數(shù)為null是將驗證添加權(quán)限否則驗證
3、修改權(quán)限 SysAuthorize(Permission.Add,Permission.Edit,"id",null) public ActionResult Edit(int? id) 對于第三種情況,我們可以為action驗證指定單獨的模塊id Module(ModuleId=6) public class Controller: Controller SysAuthorize(9,Permission.List) /此方面驗證模塊9的列表權(quán)限 public ActionResult List(int CType) 對于第四種情況,我們可以為模塊
4、添加不同的參數(shù)module對應(yīng)關(guān)系 Module(ModuleId=5,"CType",1) Module(ModuleId=6,"CType",2) public class Controller: Controller 如果當(dāng)前傳入CType為1則驗證ModuleId=5,等于2是驗證ModuleId=6 SysAuthorize(Permission.List) public ActionResult List(int CType) 想法定好以后,我們就可以去實現(xiàn)了。首先,我們定義一個module的特性:/ <summary>
5、;/ 模塊信息特性/ </summary>AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)public class ModuleAttribute : Attribute public ModuleAttribute() public ModuleAttribute(int moduleId) this.ModuleId = moduleId; public ModuleAttribute(int moduleId, string parName, object value)
6、 : this(moduleId) this.ParameterName = parName; this.ParameterValue = value; / 模塊Id / </summary> public int ModuleId get; set; / <summary> / 當(dāng)前模塊對應(yīng)參數(shù)名 / </summary> public string ParameterName get; set; / <summary> / 當(dāng)前模塊參數(shù)值 / </summary> public object ParameterValue get;
7、 set; / <summary> / 驗證參數(shù)值是否有正確 / </summary> public bool CheckParameter(HttpRequestBase request) var val = requestParameterName; bool b = false; if (val = null && ParameterValue = null) b = true; else if (val != null && ParameterValue != null && val = ParameterValu
8、e.ToString() b = true; return b; View Code 實現(xiàn)了模塊特性以后,就是比較重要的驗證特性了:/ <summary>/ 系統(tǒng)權(quán)限驗證/ <remarks>/ 0,只驗證登陸:無參數(shù)時,只驗證登陸/ 1,單一:只一指定權(quán)限代碼時驗證當(dāng)前模塊的指定權(quán)限/ 2,二選一:指定兩種權(quán)限代碼時,根據(jù)參數(shù)驗證,如果參數(shù)等于指定參數(shù),則驗證前者,否則驗證后者/ </remarks>/ </summary>AttributeUsage(AttributeTargets.Class | AttributeTarget
9、s.Method, Inherited = true, AllowMultiple = false)public class SysAuthorizeAttribute : AuthorizeAttribute / <summary> / 驗證是否登陸 / </summary> public SysAuthorizeAttribute() / 驗證基本權(quán)限 / </summary> public SysAuthorizeAttribute(Permission permission) this.PermissionFlag = permission; / &
10、lt;summary> / 驗證基本權(quán)限 / </summary> public SysAuthorizeAttribute(int moduleId, Permission permission) : this(permission) this.ModuleId = moduleId; this.IsSetModuleId = true; / <summary> / 帶參數(shù)的驗證 / </summary> public SysAuthorizeAttribute(Permission permission, string parName, objec
11、t value = null) this.PermissionFlag = permission; this.ParameterName = parName; this.ParameterValue = value; / <summary> / 帶參數(shù)的驗證 / </summary> public SysAuthorizeAttribute(int moduleId, Permission permission, string parName, object value = null) : this(permission, parName, value) this.Mo
12、duleId = moduleId; this.IsSetModuleId = true; / <summary> / 帶參數(shù)的驗證二選一 / </summary> public SysAuthorizeAttribute(Permission before, Permission after, string parName, object value = null) this.PermissionFlag = before; this.PermissionFlag1 = after; this.ParameterName = parName; this.Paramet
13、erValue = value; / <summary> / 帶參數(shù)的驗證二選一 / </summary> public SysAuthorizeAttribute(int moduleId, Permission before, Permission after, string parName, object value = null) : this(before, after, parName, value) this.ModuleId = moduleId; this.IsSetModuleId = true; / <summary> / 當(dāng)前要驗證的
14、權(quán)限代碼 / </summary> private Permission? PermissionFlag get; set; / <summary> / 當(dāng)前要驗證的另一個權(quán)限代碼(當(dāng)二選一驗證驗證方式時有效) / </summary> private Permission? PermissionFlag1 get; set; / <summary> / 是否自定義設(shè)置了moduleId / </summary> private bool IsSetModuleId get; set; / <summary> / 獲取或設(shè)
15、置當(dāng)前模塊Id / </summary> public int? ModuleId get; set; / <summary> / 權(quán)限驗證參數(shù)名 / </summary> public string ParameterName get; set; / <summary> / 權(quán)限驗證參數(shù)值 / </summary> public object ParameterValue get; set; / <summary> / 驗證結(jié)果 / </summary> public bool AuthorizeResult
16、 get; private set; / <summary> / 驗證前獲取moduleId / </summary> public override void OnAuthorization(AuthorizationContext filterContext) if (!IsSetModuleId) var modules = filterContext.Controller.GetModules(); /一個模塊的的時候,只第一次進入時獲取他的模塊id,緩存以后不作處理 if (modules.Count = 1 && ModuleId = nul
17、l) if (!string.IsNullOrWhiteSpace(modules0.ParameterName) if (modules0.CheckParameter(filterContext.HttpContext.Request) ModuleId = modules0.ModuleId; else ModuleId = modules0.ModuleId; /多個模塊的時候,每次驗證強制更新及moduleid else if (modules.Count > 1) foreach (var m in modules) if (m.CheckParameter(filterCo
18、ntext.HttpContext.Request) ModuleId = m.ModuleId; break; base.OnAuthorization(filterContext); / <summary> / 核心驗證 / </summary> protected override bool AuthorizeCore(HttpContextBase httpContext) /如果未登陸,則跳轉(zhuǎn)到登陸頁 if (!httpContext.User.Identity.IsAuthenticated) httpContext.Response.Redirect(Fo
19、rmsAuthentication.LoginUrl); AuthorizeResult = true; if (PermissionFlag != null) if (PermissionFlag.Value = Permission.Administrator) return AdminSiteService.CheckAdministrator(); /未設(shè)置模塊id,則拋出異常 if (ModuleId = null) throw new Exception(string.Format("未設(shè)置模塊id的Control不能進行權(quán)限驗證!"); /處理二選一 if (
20、PermissionFlag1 != null) if (string.IsNullOrWhiteSpace(ParameterName) throw new Exception(string.Format("請為二選一驗證指定相應(yīng)的參數(shù)名!"); /如果參數(shù)值等于給定值,則驗證前者,否則驗證后者 if (CheckParameter(httpContext.Request) AuthorizeResult = AdminSiteService.CheckPermission(ModuleId.Value, (int)PermissionFlag.Value); else
21、AuthorizeResult = AdminSiteService.CheckPermission(ModuleId.Value, (int)PermissionFlag1.Value); else /一般驗證處理 /如果參數(shù)名不為空,則先驗證參數(shù)值是否匹配 if (!string.IsNullOrWhiteSpace(ParameterName) AuthorizeResult = CheckParameter(httpContext.Request); if (AuthorizeResult) AuthorizeResult = AdminSiteService.CheckPermiss
22、ion(ModuleId.Value, (int)PermissionFlag.Value); return AuthorizeResult; / <summary> / 錯誤處理 / </summary> protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) filterContext.Result = new RedirectResult("/Main/Error?code=100"); / <summary> / 驗
23、證參數(shù)值是否有正確 / </summary> private bool CheckParameter(HttpRequestBase request) var val = requestParameterName; bool b = false; if (val = null && ParameterValue = null) b = true; else if (val != null && ParameterValue != null && val = ParameterValue.ToString() b = true; ret
24、urn b; View Code 注意AuthorizeAttribute緩存問題。第一訪問時會緩存該Action的身份認(rèn)證類,所以多模塊驗證時需要重新獲取moduleId如果當(dāng)前AuthorizeAttribute沒有指定moduleid,則每次訪問強制更新其moduleId補充一下獲取控制器模塊的擴展方法:/ <summary> / 獲取控制器相關(guān)模塊 / </summary> public static List<ModuleAttribute> GetModules(this ControllerBase controller, bool
25、 useCache = true) if (controller = null) return null; string cacheKey = string.Format("0_Modules", controller.GetType().Name); if (useCache) if (CacheProvider.Cache.Contains<List<ModuleAttribute>>(cacheKey) return CacheProvider.Cache.Get<List<ModuleAttribute>>(cache
26、Key); var moduleInfos = controller.GetType().GetCustomAttributes(typeof(ModuleAttribute), false); List<ModuleAttribute> modules = new List<ModuleAttribute>(); if (moduleInfos.Length <= 0) return modules; foreach (var m in moduleInfos) modules.Add(ModuleAttribute)m); if (useCache) /緩存控
27、制器模塊信息 CacheProvider.Cache.Add<List<ModuleAttribute>>(cacheKey, modules, 20); return modules; View Code 驗證方法主要是幫我們區(qū)分出是驗證哪一個模塊的哪一個權(quán)限,最后把模塊id和權(quán)限標(biāo)識傳入我們的邏輯層進行驗證,我們可以在登陸的時候緩存用戶的模塊權(quán)限。驗證大致代碼: / <summary> / 判斷當(dāng)前登陸用戶對操作是否有權(quán)限 / </summary> public static bool CheckPermission(
28、int ModuleId, int permissionFlag) /FormsAuthentication.GetAuthCookie() var user = HttpContext.Current.User; /未登陸的用戶 if (!user.Identity.IsAuthenticated) return false; AdminInfo info = GetLoginAdminInfo(); /超級管理員有所有權(quán)限 if (info.RoleId = Constant.AdministratorRoleId) return true; if (!info.ModulePermiss
29、ions.Exists(t => t.AdminId = info.AdminId && t.ModuleId = ModuleId && t.PermissionFlag = permissionFlag) return false; return true; View Code 最后,我們就可以在我們的系統(tǒng)中使用了:using FL.Entitys;using FL.Site.Service;using FL.Site.SysManager.Common;using System;using System.Collections.Gener
30、ic;using System.Linq;using System.Web;using System.Web.Mvc;using FL.Site.ViewModel;using FL.Site.SysManager.JUI;namespace FL.Site.SysManager.Controllers Module(ModuleId = 7) public class AdminController : BaseController<AdminSiteService> / <summary> / 分頁列表 / </summary> SysAuthorize
31、(Permission.List) public ActionResult List(PagerPostItem postPager) var pager = new PagerItem(postPager, TargetType.NavTab); int recordCount; var list = Service.GetPageList(pager.currentPage, pager.numPerPage, out recordCount); pager.totalCount = recordCount; var roles = new RoleSiteService().GetRol
32、es(); ViewBag.Roles = roles; return View(list, pager); / <summary> / 編輯輸入 / </summary> SysAuthorize(Permission.Add, Permission.Update, "id") public ActionResult Edit(int? id) var entity = new AdminSaveModel(); if (id != null) entity = Service.GetById(id.Value); var roles = new
33、RoleSiteService().GetRoles(); ViewBag.Roles = new SelectList(roles, "RoleId", "RoleName", entity.RoleId); return View(entity); / <summary> / 保存數(shù)據(jù) / </summary> HttpPost SysAuthorize(Permission.Add, Permission.Update, "AdminId", 0) public ActionResult Edit(AdminSaveModel entity) entity.LastUpdateTime = DateTime.Now; entity.LastUpdateAdmin = UserInfo.LoginName; if (ModelState.IsValid) return Json(Service.Save(entity); else return Json(AjaxResult.NewModelCheckErrorResult(ModelState); / <summary> /
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- UX 設(shè)計師崗位面試問題及答案
- 2025屆河北省秦皇島市一中高二下化學(xué)期末教學(xué)質(zhì)量檢測試題含解析
- 2025屆天津市靜海區(qū)獨流中學(xué)化學(xué)高二下期末調(diào)研試題含解析
- 村鎮(zhèn)園林項目管理辦法
- 華為運動啟動管理辦法
- 華潤燃?xì)饪冃Ч芾磙k法
- 農(nóng)村代理記賬管理辦法
- 公共綠化區(qū)域管理辦法
- 檢察檔案保密管理辦法
- 多功能復(fù)合創(chuàng)可貼-洞察及研究
- 護理核心制度考試試卷(附答案)
- 尾礦工安全培訓(xùn)
- 西安高新區(qū)管委會招聘筆試真題2024
- 2025年中國工商銀行招聘筆試備考題庫(帶答案詳解)
- 研發(fā)項目工時管理制度
- 浮選藥劑安全管理制度
- 技術(shù)異化的解放路徑-洞察及研究
- 2025年連云港市中考語文試卷真題(含標(biāo)準(zhǔn)答案)
- 2025年學(xué)校校長公開選拔筆試試題及參考答案校長招聘考試筆試真題
- T/CGMA 033002-2020壓縮空氣站節(jié)能設(shè)計指南
- 南通國家級南通經(jīng)濟技術(shù)開發(fā)區(qū)公開招聘招商人員筆試歷年參考題庫附帶答案詳解
評論
0/150
提交評論