一、基于Java代碼的配置
最簡(jiǎn)單的創(chuàng)建并且使用SecurityManager的方式就是直接在代碼中創(chuàng)建org.apache.shiro.mgt.DefaultSecurityManager類(lèi)實(shí)例,比如:
1 Realm realm =//instantiate or acquire a Realm instance. We'll discuss Realms later.2 SecurityManager securityManager =newDefaultSecurityManager(realm);3 //Make the SecurityManager instance available to the entire application via static memory:4 SecurityUtils.setSecurityManager(securityManager);
只需區(qū)區(qū)三行代碼,我們就已經(jīng)為任何類(lèi)型的應(yīng)用程序配置好了一個(gè)全功能的Shiro運(yùn)行環(huán)境,你看,多簡(jiǎn)單。
SecurityManager對(duì)象圖譜:
就像我們?cè)诩軜?gòu)一節(jié)中介紹的,SecurityManager的實(shí)現(xiàn)是模塊化的,而且可以兼容JavaBean,所以你可以通過(guò)setter和getter方法來(lái)配置SecurityManager及其內(nèi)部組件。
比如如果你想把一個(gè)自定義的SessionDAO配置為SecurityManager的Session管理器,你可以直接調(diào)用SessionManager的setSessionDAO方法。
... DefaultSecurityManager securityManager =newDefaultSecurityManager(realm); SessionDAO sessionDAO =newCustomSessionDAO(); ((DefaultSessionManager)securityManager.getSessionManager()).setSessionDAO(sessionDAO); ...
你可以通過(guò)這種調(diào)用setter方法的方式來(lái)設(shè)置SecurityManager的任何內(nèi)置組件。但是對(duì)于現(xiàn)實(shí)的應(yīng)用程序來(lái)說(shuō),這不是一種理想的配置方式。主要有以下幾點(diǎn)原因:
#,這種直接編碼的方式要求我們知道這個(gè)具體的實(shí)現(xiàn)類(lèi)在哪,并且要自己去創(chuàng)建他。而我們一般建議是依賴(lài)于抽象而不是具體,所以最好不要讓我知道他具體的實(shí)現(xiàn)在哪里。
#,由于java的類(lèi)型安全特性,當(dāng)我們通過(guò)getter方法獲取到某個(gè)類(lèi)的具體實(shí)現(xiàn)之后,我們將不得不把他們強(qiáng)制類(lèi)型轉(zhuǎn)換為具體的類(lèi)型,如此多的強(qiáng)制類(lèi)型轉(zhuǎn)換太丑了,不是一種好的編程實(shí)踐。
#,如果我們通過(guò)SecurityUtils.setSecurityManager方法為當(dāng)前的應(yīng)用設(shè)置一個(gè)虛擬機(jī)范圍內(nèi)的靜態(tài)SecurityManager對(duì)象,在大多數(shù)應(yīng)用中都是ok的。但是如果我們要在一個(gè)虛擬機(jī)上運(yùn)行多個(gè)使用Shiro的應(yīng)用程序時(shí),就可能會(huì)出亂子了。所以如果能夠?yàn)槊總€(gè)應(yīng)用程序創(chuàng)建一個(gè)的單例就更好了;
#,每次你要修改一下Shiro的配置都不得不重新編譯程序;
雖然有以上提到的種種缺點(diǎn),但是如果你要在一個(gè)內(nèi)