版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、在MVC中,我們可以通過(guò)在action或者controller上設(shè)置AuthorizeRole="xxx" 的方式來(lái)設(shè)置用戶對(duì)action的訪問(wèn)權(quán)限。顯然,這樣并不能滿足我們的需求,對(duì)于一般的MVC系統(tǒng)來(lái)說(shuō),如果我們定義一個(gè)controller來(lái)處理一個(gè)模塊的話,我們大致有以下需求:一,單個(gè)action的訪問(wèn)權(quán)限。如果刪除,列表action二,一個(gè)action兩種權(quán)限,如edit(int? id)如果id為null則添加,或者修改三,在此cotroller驗(yàn)證其它模塊權(quán)限,比如,我們要在新聞模塊獲取新聞列表四,對(duì)于某些通過(guò)模塊,如分類,我們希望通過(guò)傳入不同的參數(shù)可以驗(yàn)證不同
2、模塊的權(quán)限對(duì)于四種情況,我理想的想法是:對(duì)于第一種,直接制定controller的moduleid和action的權(quán)限 Module(ModuleId=6)public class Controller: Controller SysAuthorize(Permission.List) /設(shè)置action要驗(yàn)證的權(quán)限 public ActionResult List() 對(duì)于第二種情況,我們希望通過(guò)參數(shù)來(lái)達(dá)到驗(yàn)證那個(gè)權(quán)限的目的: Module(ModuleId=6) public class Controller: Controller /如果參數(shù)為null是將驗(yàn)證添加權(quán)限否則驗(yàn)證
3、修改權(quán)限 SysAuthorize(Permission.Add,Permission.Edit,"id",null) public ActionResult Edit(int? id) 對(duì)于第三種情況,我們可以為action驗(yàn)證指定單獨(dú)的模塊id Module(ModuleId=6) public class Controller: Controller SysAuthorize(9,Permission.List) /此方面驗(yàn)證模塊9的列表權(quán)限 public ActionResult List(int CType) 對(duì)于第四種情況,我們可以為模塊
4、添加不同的參數(shù)module對(duì)應(yīng)關(guān)系 Module(ModuleId=5,"CType",1) Module(ModuleId=6,"CType",2) public class Controller: Controller 如果當(dāng)前傳入CType為1則驗(yàn)證ModuleId=5,等于2是驗(yàn)證ModuleId=6 SysAuthorize(Permission.List) public ActionResult List(int CType) 想法定好以后,我們就可以去實(shí)現(xiàn)了。首先,我們定義一個(gè)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)前模塊對(duì)應(yīng)參數(shù)名 / </summary> public string ParameterName get; set; / <summary> / 當(dāng)前模塊參數(shù)值 / </summary> public object ParameterValue get;
7、 set; / <summary> / 驗(yàn)證參數(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 實(shí)現(xiàn)了模塊特性以后,就是比較重要的驗(yàn)證特性了:/ <summary>/ 系統(tǒng)權(quán)限驗(yàn)證/ <remarks>/ 0,只驗(yàn)證登陸:無(wú)參數(shù)時(shí),只驗(yàn)證登陸/ 1,單一:只一指定權(quán)限代碼時(shí)驗(yàn)證當(dāng)前模塊的指定權(quán)限/ 2,二選一:指定兩種權(quán)限代碼時(shí),根據(jù)參數(shù)驗(yàn)證,如果參數(shù)等于指定參數(shù),則驗(yàn)證前者,否則驗(yàn)證后者/ </remarks>/ </summary>AttributeUsage(AttributeTargets.Class | AttributeTarget
9、s.Method, Inherited = true, AllowMultiple = false)public class SysAuthorizeAttribute : AuthorizeAttribute / <summary> / 驗(yàn)證是否登陸 / </summary> public SysAuthorizeAttribute() / 驗(yàn)證基本權(quán)限 / </summary> public SysAuthorizeAttribute(Permission permission) this.PermissionFlag = permission; / &
10、lt;summary> / 驗(yàn)證基本權(quán)限 / </summary> public SysAuthorizeAttribute(int moduleId, Permission permission) : this(permission) this.ModuleId = moduleId; this.IsSetModuleId = true; / <summary> / 帶參數(shù)的驗(yàn)證 / </summary> public SysAuthorizeAttribute(Permission permission, string parName, objec
11、t value = null) this.PermissionFlag = permission; this.ParameterName = parName; this.ParameterValue = value; / <summary> / 帶參數(shù)的驗(yàn)證 / </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ù)的驗(yàn)證二選一 / </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ù)的驗(yàn)證二選一 / </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)前要驗(yàn)證的
14、權(quán)限代碼 / </summary> private Permission? PermissionFlag get; set; / <summary> / 當(dāng)前要驗(yàn)證的另一個(gè)權(quán)限代碼(當(dāng)二選一驗(yàn)證驗(yàn)證方式時(shí)有效) / </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)限驗(yàn)證參數(shù)名 / </summary> public string ParameterName get; set; / <summary> / 權(quán)限驗(yàn)證參數(shù)值 / </summary> public object ParameterValue get; set; / <summary> / 驗(yàn)證結(jié)果 / </summary> public bool AuthorizeResult
16、 get; private set; / <summary> / 驗(yàn)證前獲取moduleId / </summary> public override void OnAuthorization(AuthorizationContext filterContext) if (!IsSetModuleId) var modules = filterContext.Controller.GetModules(); /一個(gè)模塊的的時(shí)候,只第一次進(jìn)入時(shí)獲取他的模塊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; /多個(gè)模塊的時(shí)候,每次驗(yàn)證強(qiáng)制更新及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> / 核心驗(yàn)證 / </summary> protected override bool AuthorizeCore(HttpContextBase httpContext) /如果未登陸,則跳轉(zhuǎn)到登陸頁(yè) 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不能進(jìn)行權(quán)限驗(yàn)證!"); /處理二選一 if (
20、PermissionFlag1 != null) if (string.IsNullOrWhiteSpace(ParameterName) throw new Exception(string.Format("請(qǐng)為二選一驗(yàn)證指定相應(yīng)的參數(shù)名!"); /如果參數(shù)值等于給定值,則驗(yàn)證前者,否則驗(yàn)證后者 if (CheckParameter(httpContext.Request) AuthorizeResult = AdminSiteService.CheckPermission(ModuleId.Value, (int)PermissionFlag.Value); else
21、AuthorizeResult = AdminSiteService.CheckPermission(ModuleId.Value, (int)PermissionFlag1.Value); else /一般驗(yàn)證處理 /如果參數(shù)名不為空,則先驗(yàn)證參數(shù)值是否匹配 if (!string.IsNullOrWhiteSpace(ParameterName) AuthorizeResult = CheckParameter(httpContext.Request); if (AuthorizeResult) AuthorizeResult = AdminSiteService.CheckPermiss
22、ion(ModuleId.Value, (int)PermissionFlag.Value); return AuthorizeResult; / <summary> / 錯(cuò)誤處理 / </summary> protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) filterContext.Result = new RedirectResult("/Main/Error?code=100"); / <summary> / 驗(yàn)
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緩存問(wèn)題。第一訪問(wèn)時(shí)會(huì)緩存該Action的身份認(rèn)證類,所以多模塊驗(yàn)證時(shí)需要重新獲取moduleId如果當(dāng)前AuthorizeAttribute沒(méi)有指定moduleid,則每次訪問(wèn)強(qiáng)制更新其moduleId補(bǔ)充一下獲取控制器模塊的擴(kuò)展方法:/ <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 驗(yàn)證方法主要是幫我們區(qū)分出是驗(yàn)證哪一個(gè)模塊的哪一個(gè)權(quán)限,最后把模塊id和權(quán)限標(biāo)識(shí)傳入我們的邏輯層進(jìn)行驗(yàn)證,我們可以在登陸的時(shí)候緩存用戶的模塊權(quán)限。驗(yàn)證大致代碼: / <summary> / 判斷當(dāng)前登陸用戶對(duì)操作是否有權(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(); /超級(jí)管理員有所有權(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> / 分頁(yè)列表 / </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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022年海南省三亞市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2023年山西省臨汾市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2024年短視頻內(nèi)容創(chuàng)作與版權(quán)許可合同
- 2024沙場(chǎng)資源綜合利用開(kāi)發(fā)承包合同3篇
- 2024年餐飲投資合伙合同細(xì)則一
- 2024校園活動(dòng)策劃與實(shí)施服務(wù)合同
- 2024年金融科技產(chǎn)品定制開(kāi)發(fā)服務(wù)協(xié)議3篇
- 2024年金融機(jī)構(gòu)間借款保證合同書2篇
- 2023-2024年中級(jí)經(jīng)濟(jì)師之中級(jí)經(jīng)濟(jì)師經(jīng)濟(jì)基礎(chǔ)知識(shí)試題(附答案)
- 2023-2024年國(guó)家電網(wǎng)招聘之經(jīng)濟(jì)學(xué)類試題及答案二
- (八省聯(lián)考)河南省2025年高考綜合改革適應(yīng)性演練 化學(xué)試卷(含答案)
- 2025中國(guó)電信山東青島分公司校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年八省聯(lián)考高考語(yǔ)文作文真題及參考范文
- 新課標(biāo)(水平三)體育與健康《籃球》大單元教學(xué)計(jì)劃及配套教案(18課時(shí))
- 開(kāi)題報(bào)告-鑄牢中華民族共同體意識(shí)的學(xué)校教育研究
- 計(jì)件工勞務(wù)合同范例
- 2024年公交車開(kāi)通儀式講話例文(4篇)
- 科研倫理與學(xué)術(shù)規(guī)范(研究生)期末試題庫(kù)及答案
- 機(jī)動(dòng)車交通事故快速處理協(xié)議書(最新格式)
- 最新拉鏈廠安全操作規(guī)程
- CTG-MBOSS CRM20 分總冊(cè)_普訓(xùn)版_圖文
評(píng)論
0/150
提交評(píng)論