企業(yè)級(jí)系統(tǒng)的認(rèn)證與授權(quán)設(shè)計(jì)
首先我們要搞清楚一個(gè)問(wèn)題,什么是認(rèn)證,什么是授權(quán)。
認(rèn)證——你是誰(shuí)(Who)?
認(rèn)證:認(rèn)證(authentication):即對(duì)不同的用戶進(jìn)行識(shí)別,檢查用戶是否有權(quán)限對(duì)那些受限制的界面進(jìn)行訪問(wèn),這種稱為認(rèn)證。比如登錄。
授權(quán)——誰(shuí)(Who),在那個(gè)系統(tǒng)(Where),可以做什么(What)?
授權(quán)(authorization):決定用戶可以對(duì)哪些功能按鈕進(jìn)行操作,對(duì)那些數(shù)據(jù)(數(shù)據(jù)行,數(shù)據(jù)列)進(jìn)行有效的訪問(wèn)即稱作為授權(quán)。
其中功能操作的授權(quán)稱作為功能權(quán)限。比如下圖:?jiǎn)T工A要有 公司知識(shí)庫(kù)平臺(tái)->培訓(xùn)->培訓(xùn)預(yù)算->申請(qǐng)培訓(xùn)->培訓(xùn)列表頁(yè)面的【查詢】和【申請(qǐng)】按鈕,同時(shí)員工A要有 公司綜合管理平臺(tái) ->信息中心->通知公告->通知公告列表頁(yè)面的【發(fā)布】和【查詢】按鈕的操作權(quán)限。如圖所示,在現(xiàn)實(shí)場(chǎng)景中,跨平臺(tái),跨系統(tǒng)的場(chǎng)景比比皆是。
其中數(shù)據(jù)權(quán)限以下圖為例:我們看到下圖用紅色框圈起來(lái)了一個(gè)數(shù)據(jù)列表。假設(shè)這個(gè)數(shù)據(jù)列表為某企業(yè)集團(tuán)的銷售匯總表。
現(xiàn)在客戶提出了如下幾個(gè)需求:
1) 銷售總經(jīng)理可以查看所有的匯總數(shù)據(jù)。
2) 大區(qū)經(jīng)理只能查看自己所屬大區(qū)的數(shù)據(jù)。
3) 職位等級(jí)在二級(jí)以下(包括二級(jí))的只能查看自己所屬區(qū)域交易累計(jì)金額小于1000的數(shù)據(jù)。
4) 只有銷售總經(jīng)理,大區(qū)經(jīng)理能查看聯(lián)系方式。
如此需求,在企業(yè)級(jí)ERP開發(fā)中屢見(jiàn)不鮮,為了解決客戶的需求,我們不得不反復(fù)的去修改和發(fā)布代碼,其實(shí)我們可以通過(guò)簡(jiǎn)單的配置來(lái)滿足客戶的需求。這個(gè)簡(jiǎn)單的配置我們就可以稱之為認(rèn)證授權(quán)系統(tǒng),說(shuō)到這兒,就簡(jiǎn)單的把這個(gè)系統(tǒng)的概念引申出來(lái)了。
那我們要設(shè)計(jì)這個(gè)系統(tǒng),我們要考慮到一些什么因素呢?要做出一個(gè)適應(yīng)客戶需求變化的系統(tǒng),必須要具備一個(gè)良好的設(shè)計(jì)。
首先,認(rèn)證與授權(quán)系統(tǒng)的架構(gòu)應(yīng)該是一個(gè)SOA的架構(gòu)。這兒所用的SOA絕對(duì)不是趕技術(shù)的時(shí)髦。因?yàn)橐粋€(gè)企業(yè)集團(tuán)可能有幾個(gè),甚而幾十個(gè),上百個(gè)的子系統(tǒng)。我們不可能為每個(gè)子系統(tǒng)都維護(hù)個(gè)套用戶表,角色表,以及一套權(quán)限系統(tǒng)。所以要把這個(gè)認(rèn)證與授權(quán)的功能給抽出來(lái),做成一個(gè)松耦合的子系統(tǒng)。但同時(shí)這個(gè)子系統(tǒng)要與其它系統(tǒng)進(jìn)行數(shù)據(jù)交互,所以我們要采用一定的技術(shù)手段來(lái)與業(yè)務(wù)系統(tǒng)通信,不管是用Web Service還是WCF,其實(shí)目的都只有一個(gè),就是讓認(rèn)證與授權(quán)系統(tǒng)與其它業(yè)務(wù)系統(tǒng)進(jìn)行通信。這樣即實(shí)現(xiàn)了一處維護(hù)多處運(yùn)用的場(chǎng)景,這樣就實(shí)現(xiàn)了系統(tǒng)級(jí)的重用,當(dāng)然,采用了SOA的開發(fā),就不得不提SOA的安全,我在這個(gè)系統(tǒng)里是使用的c#攔截器機(jī)制,具體的實(shí)現(xiàn)以后有機(jī)會(huì)單獨(dú)提出來(lái)與大家分享,有感興趣的朋友我們可以建一個(gè)群共同交流。
其次,系統(tǒng)的可擴(kuò)展性要強(qiáng),特別要有一個(gè)強(qiáng)有力的代碼支撐。比如認(rèn)證授權(quán)這個(gè)系統(tǒng),用B/S模式的更好,還是用C/S模式的更好?這個(gè)是各圓其說(shuō),我做了六年的B/S項(xiàng)目,但是我***還是選擇用C/S的結(jié)構(gòu)來(lái)開發(fā),其中的原因以后有時(shí)間一一道來(lái)。我們來(lái)欣賞下現(xiàn)的一個(gè)代碼片段:
我把客戶端的驗(yàn)證放在了Model上,如果在B/S架構(gòu)下,我不用重復(fù)的去寫一次JavaScript的驗(yàn)證。常用MVC的朋友都知道在B/S結(jié)構(gòu)下,怎樣用Model的屬性進(jìn)行客戶端的驗(yàn)證了。在C/S結(jié)構(gòu)下,可以通過(guò)WPF輕而易舉的實(shí)現(xiàn)客戶端的驗(yàn)證,這樣寫的目的,就達(dá)到了代碼級(jí)別的重用。
還有一個(gè)比較重要的因素,就是用戶體驗(yàn)。當(dāng)我們的程序設(shè)計(jì)的如何的好,代碼重構(gòu)的怎樣的精練,如果沒(méi)有一個(gè)好的人機(jī)交互,想必會(huì)抹殺很大一批用戶的好感。對(duì)我們程序員來(lái)說(shuō),要設(shè)計(jì)一個(gè)好的人機(jī)交互界面,確實(shí)有待提升。我以現(xiàn)在這個(gè)系統(tǒng)的UI來(lái)說(shuō)吧,在短短半年的時(shí)間里,UI重構(gòu)了三次,***次是用WPF下的Ribbon插件來(lái)設(shè)計(jì)的。第二次是用微軟官方示例提供的設(shè)計(jì),其中還包括了動(dòng)態(tài)翻頁(yè)的效果,非常炫。第三次,采用微軟的Metro風(fēng)格設(shè)計(jì)。很明顯每次的設(shè)計(jì)都有質(zhì)的提升。
***個(gè)版本的界面:Ribbon。
第二個(gè)版本的界面:WPF技術(shù)下實(shí)現(xiàn)的翻頁(yè)特效界面。
第三個(gè)版本的界面(Metro):采用Prism + MVVM開發(fā)的。
每個(gè)界面雖然都丑,但是也各具特色。只是個(gè)人的喜好而已。
原文鏈接:http://www.cnblogs.com/xcj26/archive/2013/03/28/2984840.html
【編輯推薦】