




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、a mvc權限設計思考 (一)數據庫建庫部分 目前各類的權限設計已經困擾了我們好久,對于mvc,下面我將通過actionfilter來擴展我們的權限認證,以下示例是從我的一個課程中心項目中提取出來,希望對各位初學者起到拋磚引玉的作用。下面首先來設計我們的權限控制的數據庫層。下面我來依次介紹每個字段的說明rolegroup 權限組表 該表主要對系統權限進行分組,我們的用戶可以直接賦予該分組,擁有所有該組權限roleid 權限組id 例:01rolename 權限組名稱 例:系統管理員rolestate 組狀態 (是否啟用) 例:truerolegroupapplist 表 組權限對應表 該表主要
2、復制每個權限組對應的權限詳細列表id id主鍵 例:1roleid 對應權限組的id 例:01sysappid 對應的詳細權限組id 例:01starttime 該權限使用的起始日期 例:2009-01-01 ,該字段屬性默認為:all ,即不限制起始日期endtime 該權限使用的結束日期 例:2009-01-01 ,該字段屬性默認為:all ,即不限制結束日期sysappcate 表 該表主要是對sysapplist詳細權限表做分類,當我們的權限頁面特別多的時候,該表主要為了方便管理??墒÷詓ysappcateid 大類id 例:01sysappcatename 大類名稱 例:新聞管理sy
3、sappcateename 大類英文名sysapplist 權限詳細表 該表主要負責所有權限的基礎列表sysappid 權限id 例:01sysappcateid 權限大類id 例:01sysappname 權限名稱 例:新聞添加sysappename 權限英文名稱sysappcontroller 權限對應的controller 例:newssysappaction 權限對應的action 例:add 本權限設計針對對action權限限制isview 是否為可見 例:true 該字段的設計主要是便于后臺的管理和設置,因為有部分action是沒有view層的,比如post,但是在后臺權限管理中我
4、們又要用到他。好了,建庫部分就到這里了,下一篇我會介紹邏輯部分,其中會涉及到repository模式,緩存,自定義的authorizeattribute。a mvc權限設計思考 (二)邏輯部分實現 在我的項目中,我還是使用的linq to sql ,因為我的項目不會涉及太多很太復雜的數據庫操作業務。當然如果設計,我相信linq to sql的自定義擴展也能滿足需求。使用repository模式是最近mvc很多項目采用的解決方案,能把原來我們雜亂的linq to sql統一封裝起來。讓我們的架構更清晰。現在來看看具體實現。irepository接口:代碼 interfaceirepository
5、wheretentity:classiqueryablefindall(expressionfuncexp);tentityfind(expressionfuncexp);voidadd(tentityentity);voiddelete(tentityentity);voidsave();repository實現:代碼 publicclassrepository:irepositorywheretentity:classprotecteddal.coursecenterdatadb;publicrepository()db=newdal.coursecenterdata();/查找所有數據/
6、publiciqueryablefindall()returndb.gettable().where(p=1=1);/查找所有數據/條件表達式/publiciqueryablefindall(expressionfuncexp)returndb.gettable().where(exp);/查找一個數據/條件表達式/publictentityfind(expressionfuncexp)returndb.gettable().firstordefault(exp);/添加數據/實體publicvoidadd(tentityentity)db.gettable().insertonsubmit(
7、entity);/刪除數據/實體publicvoiddelete(tentityentity)db.gettable().deleteonsubmit(entity);/批量添加數據/實體列表publicvoidaddall(ienumerableentity)db.gettable().insertallonsubmit(entity);/批量刪除數據/實體列表publicvoiddeleteall(ienumerableentity)db.gettable().deleteallonsubmit(entity);/對數據做插入,更新,刪除操作/publicvoidsave()db.subm
8、itchanges();網上已經有很多repository的例子,但是請注意find中的條件必須是expression tree的擴展,否則在數據查詢的sql語句中,你會發現捕獲到的將是select一個表之后再來做數據的查詢,這在我們海量數據查詢時不允許的?,F在我們已經有了自己的repository,下面來建立一個數據庫視圖把我們上一講需要的數據拿出來。新建視圖viewrolegroup,選定一下表和字段我們通過vs2008新建一個linq to sql類,拖入這個視圖。然后我們需要思考,這個權限分組視圖是系統頻繁讀取的,需要為他創建一個緩存。新建一個緩存類caches:代碼 /緩存操作基類/
9、publicclasscaches/建立緩存/publicstaticobjecttryaddcache(stringkey,objectvalue,cachedependencydependencies,datetimeabsoluteexpiration,timespanslidingexpiration,cacheitemprioritypriority,cacheitemremovedcallbackonremovedcallback)if(httpruntime.cachekey=null&value!=null)returnhttpruntime.cache.add(key,val
10、ue,dependencies,absoluteexpiration,slidingexpiration,priority,onremovedcallback);elsereturnnull;/移除緩存/publicstaticobjecttryremovecache(stringkey)if(httpruntime.cachekey!=null)returnhttpruntime.cache.remove(key);elsereturnnull;/移除鍵中帶某關鍵字的緩存/publicstaticvoidremovemulticache(stringkeyinclude)idictionar
11、yenumeratorcacheenum=httpruntime.cache.getenumerator();while(cacheenum.movenext()if(cacheenum.key.tostring().indexof(keyinclude.tostring()=0)httpruntime.cache.remove(cacheenum.key.tostring();/移除所有緩存/publicstaticvoidremoveallcache()idictionaryenumeratorcacheenum=httpruntime.cache.getenumerator();whil
12、e(cacheenum.movenext()httpruntime.cache.remove(cacheenum.key.tostring(); 來看看我們的viewrolegrouprepository怎么寫。新建類:viewrolegrouprepository代碼 publicclassviewrolegrouprepository:repository/獲取權限視圖緩存列表,key:viewgrouplist/publiclistgetcacheall()listviewrolegroup;stringkey=viewgrouplist;if(httpruntime.cachekey!
13、=null)viewrolegroup=(list)httpruntime.cachekey;elseviewrolegroup=findall().tolist();caches.tryaddcache(key,viewrolegroup,null,cache.noabsoluteexpiration,timespan.fromminutes(20),system.web.caching.cacheitempriority.normal,null);returnviewrolegroup;接下來我們將自定義自己的authorizeattribute,新建類centerauthorizeatt
14、ribute代碼 publicclasscenterauthorizeattribute:authorizeattributepublicoverridevoidonauthorization(authorizationcontextfiltercontext)stringaction=(string)filtercontext.routedata.valuesaction;stringcontroller=(string)filtercontext.routedata.valuescontroller;stringfullname=filtercontext.httpcontext.user
15、.identity.name;if(!filtercontext.httpcontext.user.identity.isauthenticated)filtercontext.httpcontext.response.redirect(string.format(/account/logon?returnurl=0,filtercontext.httpcontext.request.url.pathandquery);elseif(newlogin().islock(fullname)thrownewexception(string.format(【用戶:0】對不起,該用戶已被鎖定。,ful
16、lname);varr=newbll.rolegrouprepository().getuserrolegroup(fullname);varq=newbll.viewrolegrouprepository().getcacheall().findall(c=c.roleid=r.roleid&c.sysappcontroller=controller&c.sysappaction=action&(c.starttime.equals(anytime,stringcomparison.currentcultureignorecase)?true:(datetime.parse(c.startt
17、ime)=datetime.now);if(q.count=0)thrownewexception(string.format(【用戶:0】對不起,您沒有訪問該頁面的權限。,fullname);請注意varr=newbll.rolegrouprepository().getuserrolegroup(fullname);這個是我項目中通過用戶名獲得用戶權限分組的實現,大家參考自己項目修改。大功告成,那怎么用呢,很簡單。創建了需要的權限組,例如超級管理員 然后把對應的controller和action權限加入到組后,在需要的action上進行標注,例如centerauthorizepublica
18、ctionresultindex()viewdatamessage=welcometoasp.netmvc!;returnview();是不是很簡單就通過數據庫控制到每個需要權限控制的action咯?當然很多朋友可能還很迷糊,第一次寫這類文章。部分代碼也沒調試。因為從項目剝離出來,所以大家見諒。ui部分和數據庫的操作這里想濾過啦。這些比較簡單的東西,大家應該很容易就能實現咯。a mvc權限設計思考 (三)后臺ui設計 一些朋友提出讓我加上細節部分,也有朋友pm說很多地方看不懂不知道該怎么用,由于目前正在趕學校的課程中心,暫沒有時間來詳細介紹使用,這里我把后臺的一些設計截圖出來,大家參考設計另外
19、在第二篇提到的centerauthorizeattribute部分,已經做部分修改,原來的會出現邏輯判斷的bug。權限大類管理 sysappcate可以看出,權限大類其實對應的是上部的大類菜單,當添加新的大類,該菜單將加載相應的項并呈現出來。權限列表管理 sysapplist這個界面對應系統所有的權限,有朋友提出如果出現相同的action,那么將無法分類管理,其實我認為不然,相同的action一般用到的設計無非是post和get的請求變更,那么如果一個頁面只可以訪問卻無法操作,這樣還有必要呈現給用戶么?大家請注意觀察,在這里的設置中如果為是否現實為:false,那么該權限將不會按照分組呈現在左
20、側的管理菜單中。權限組管理rolegroup這個表建立我們需要的系統權限組,這樣更方便我們的管理。按照我的項目經驗,一個項目很少會出現上百個權限組的要求,在課程中心這個項目中,當然也不會涉及到那么多的權限分類。這里為每一個權限多了一個“設置”的選項,下面來看看“設置”是怎么完成的.這里我做了一個tab,按照權限的大類分別放置所屬的權限并進行加載。開始時間和結束時間是控制該權限在權限組中可以操作的時間,那么設置為anytime,也就表示開始或者結束為無限期。我在該項目中間會用到申報等一些流程,那么我們必須控制時間來按照需要進行申報。這里我們還要考慮,應該是當權限發生的更改,才提交這個數據,否則每
21、次都提交這么多權限進行更新,效率上講我們犯了一個低級的錯誤。上圖的邏輯最終將更新至rolegroupapplist表中。好了,現在權限整體的結構都已經設計好,接下來將看看怎么把權限應用在對應用戶上,這個很簡單,但是還是比較說明一下我們現在只需要把對應的權限組分配給用戶,就可以獲得該組分配的權限。大家還可以看到我最上面的幾個截圖中有“幫助” ,這并不是一個固定的頁面,我通過這樣的形式來創建連接,那么可以把它放在masterpage里,不同的頁面中連接其實會變成對應的controller和action,這樣建立對應的表,可以很簡單的對應這個view視圖來加載幫助信息。最近手頭的工作實在太忙,由于時
22、間比較緊,就不一一介紹了。其實mvc給我們更大的靈活度和對視圖的控制。我從mvc1 rc版就開始使用mvc做一些小項目,很早拋棄了我認為相對臃腫的webform,有朋友也曾質疑mvc的編程模式接近asp,其實這無疑是對于mvc整個框架及應用不了解所造成的。asp.net mvc2中擴展modelmetadata的descriptionattribute。 在mvc2中默認并沒有實現descriptionattribute(雖然可以找到這個屬性,通過閱讀mvc源碼,發現并沒有實現方法),這很不方便,特別是我們使用editorformodel的時候,我們需要對字段進行簡要的介紹,下面來擴展這個屬性
23、。新建類 descriptionmetadataprovider然后重寫dataannotationsmodelmetadataprovider的createmetadata方法:publicclassdescriptionmetadataprovider:dataannotationsmodelmetadataproviderprotectedoverridemodelmetadatacreatemetadata(ienumerableattributes,typecontainertype,funcmodelaccessor,typemodeltype,stringpropertyname)listattributelist=newlist(attributes);dataannotationsmodelmetadataresult=(dataannotationsmodelmetadata)base.createmetadata(attributes,containertype,modelaccessor,modeltype,propertyname);descript
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廢舊資源購銷合同協議
- 后廚設備配送合同協議
- 專業代理機構合同協議
- 專利撰寫合同協議
- 專柜采購合同協議
- 店面租金定金合同協議
- 店面轉讓合同解除協議
- 三方合作合同協議模板
- 廢舊木柴買賣合同協議
- agv小車維修合同協議
- 公立醫院成本核算指導手冊
- 第16課《有為有不為》公開課一等獎創新教學設計
- 小米創業思考(商業思考)
- 國開(甘肅)2024年春《地域文化(專)》形考任務1-4終考答案
- 往日時光(原版)鋼琴雙手簡譜_鋼琴譜_鋼琴簡譜
- RCS-985說明書V300
- Mayo肘關節功能評分
- 2014—2015—2《刑法總論》教學大綱(修正版)
- 《焦慮癥基礎知識》PPT課件.ppt
- 發電廠電氣一次部分設計—2×300+2×200MW
- 基于深度學習的鳥類識別系統的設計與實現
評論
0/150
提交評論