国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
SpringSide 3 中的安全框架

在SpringSide 3的官方文檔中,說安全框架使用的是Spring Security 2.0。乍一看,嚇了我一跳,以為Acegi這么快就被淘汰了呢。上搜索引擎一搜,發(fā)現(xiàn)原來Spring Security 2.0就是Acegi 2.0。懸著的心放下來了。雖然SpringSide 3中關(guān)于Acegi的配置文件看起來很不熟悉,但是讀了Acegi 2.0的官方文檔后,一切都釋然了。

先來談一談Acegi的基礎(chǔ)知識,Acegi的架構(gòu)比較復(fù)雜,但是我希望我下面的只言片語能夠把它說清楚。大家都知道,如果要對Web資源進行保護,最好的辦法莫過于Filter,要想對方法調(diào)用進行保護,最好的辦法莫過于AOP。Acegi對Web資源的保護,就是靠Filter實現(xiàn)的。如下圖:



一般來說,我們的Filter都是配置在web.xml中,但是Acegi不一樣,它在web.xml中配置的只是一個代理,而真正起作用的Filter是作為Bean配置在Spring中的。web.xml中的代理依次調(diào)用這些Bean,就實現(xiàn)了對Web資源的保護,同時這些Filter作為Bean被Spring管理,所以實現(xiàn)AOP也很簡單,真的是一舉兩得啊。

Acegi中提供的Filter不少,有十多個,一個一個學(xué)起來比較復(fù)雜。但是對于我們Web開發(fā)者來說,常用的就那么幾個,如下圖中的被紅圈圈標記出來的:


從上到下,它們實現(xiàn)的功能依次是1、制定必須為https連接;2、從Session中提取用戶的認證信息;3、退出登錄;4、登錄;5、記住用戶;6、所有的應(yīng)用必須配置這個Filter。

一般來說,我們寫Web應(yīng)用只需要熟悉這幾個Filter就可以了,如果不需要https連接,連第一個也不用熟悉。但是有人肯定會想,這些Filter怎么和我的數(shù)據(jù)庫聯(lián)系起來呢?不用著急,這些Filter并不直接處理用戶的認證,也不直接處理用戶的授權(quán),而是把它們交給了認證管理器和決策管理器。如下圖:

對于這兩種管理器,那也是不需要我們寫代碼的,Acegi也提供了現(xiàn)成的類。那么大家又奇怪了:又是現(xiàn)成的,那怎么和我的數(shù)據(jù)庫關(guān)聯(lián)起來呢?別著急,其實這兩個管理器自己也不做事,認證管理器把任務(wù)交給了Provider,而決策管理器則把任務(wù)交給了Voter,如下圖:

現(xiàn)在我要告訴你們,這里的Provider和Voter也是不需要我們寫代碼的。不要崩潰,快到目標了。Acegi提供了多個Provider的實現(xiàn)類,如果我們想用數(shù)據(jù)庫來儲存用戶的認證數(shù)據(jù),那么我們就選擇DaoAuthenticationProvider。對于Voter,我們一般選擇RoleVoter就夠用了,它會根據(jù)我們配置文件中的設(shè)置來決定是否允許某一個用戶訪問制定的Web資源。

而DaoAuthenticationProvider也是不直接操作數(shù)據(jù)庫的,它把任務(wù)委托給了UserDetailService,如下圖:



而我們要做的,就是實現(xiàn)這個UserDetailService。圖畫得不好,大家不要見笑,但是說了這么多總算是引出了我們開發(fā)中的關(guān)鍵,那就是我們要實現(xiàn)自己的UserDetailService,它就是連接我們的數(shù)據(jù)庫和Acegi的橋梁。UserDetailService的要求也很簡單,只需要一個返回org.springframework.security.userdetails.User對象的loadUserByUsername(String userName)方法。因此,怎么設(shè)計數(shù)據(jù)庫都可以,不管我們是用一個表還是兩個表還是三個表,也不管我們是用戶-授權(quán),還是用戶-角色-授權(quán),還是用戶-用戶組-角色-授權(quán),這些具體的東西Acegi統(tǒng)統(tǒng)不關(guān)心,它只關(guān)心返回的那個User對象,至于怎么從數(shù)據(jù)庫中讀取數(shù)據(jù),那就是我們自己的事了。

反過來再看看上面的過程,我們發(fā)現(xiàn),即使我們要做的只是實現(xiàn)自己的UserDetailService類,但是我們不得不在Spring中配置那一大堆的Bean,包括幾個Filter,幾個Manager,幾個Provider和Voter,而這些配置往往都是重復(fù)的無謂的。好在Acegi 2.0也認識到了這個問題,所以,它設(shè)計了一個<http>標簽,讓Acegi的配置得到了簡化。下面是SpringSide 3中的配置的截圖,大家可以看看:


下圖是官方文章中的傳統(tǒng)Filter設(shè)置和<http>元素之間的對應(yīng)關(guān)系:


下面的代碼是SpringSide 3中實現(xiàn)UserDetailService的范例,在SpringSide 3的范例中,白衣使用了三個表User、Role、Authority。但是Acegi不關(guān)心你用了幾個表,它只關(guān)心UserDetails對象。而決定用戶能否訪問指定Web資源的,是RoleVoter類,無需任何修改它可以工作得很好,唯一的缺點是它只認ROLE_前綴,所以搞得白衣的Authority看起來都象角色,不倫不類。

package  personal.youxia.service.security;

import  java.util.ArrayList;
import  java.util.List;

import  org.springframework.beans.factory.annotation.Required;
import  org.springframework.dao.DataAccessException;
import  org.springframework.security.GrantedAuthority;
import  org.springframework.security.GrantedAuthorityImpl;
import  org.springframework.security.userdetails.UserDetails;
import  org.springframework.security.userdetails.UserDetailsService;
import  org.springframework.security.userdetails.UsernameNotFoundException;
import  personal.youxia.entity.user.Authority;
import  personal.youxia.entity.user.Role;
import  personal.youxia.entity.user.User;
import  personal.youxia.service.user.UserManager;

/**
 * 實現(xiàn)SpringSecurity的UserDetailsService接口,獲取用戶Detail信息.
 * 
 * 
@author  calvin
 
*/
public   class  UserDetailServiceImpl  implements  UserDetailsService {

    
private  UserManager userManager;

    
public  UserDetails loadUserByUsername(String userName)  throws  UsernameNotFoundException, DataAccessException {
        User user 
=  userManager.getUserByLoginName(userName);
        
if  (user  ==   null )
            
throw   new  UsernameNotFoundException(userName  +   "  不存在 " );

        List
< GrantedAuthority >  authsList  =   new  ArrayList < GrantedAuthority > ();

        
for  (Role role : user.getRoles()) {
            
for  (Authority authority : role.getAuths()) {
                authsList.add(
new  GrantedAuthorityImpl(authority.getName()));
            }
        }

        
//  目前在MultiDatabaseExample的User類中沒有enabled, accountNonExpired,credentialsNonExpired, accountNonLocked等屬性
        
//  暫時全部設(shè)為true,在需要時才添加這些屬性.
        org.springframework.security.userdetails.User userdetail  =   new  org.springframework.security.userdetails.User(
                user.getLoginName(), user.getPassword(), 
true true true true , authsList
                        .toArray(
new  GrantedAuthority[authsList.size()]));

        
return  userdetail;
    }

    @Required
    
public   void  setUserManager(UserManager userManager) {
        
this .userManager  =  userManager;
    }
}


最后再來說說這個命名的問題,我對Authentication和Authority這兩個單詞比較反感,兩個原因,一是因為它們太生僻了,二是因為它們長得太像了,明明一個是認證,一個是授權(quán),意思相差很遠,外貌卻如此相似,確實很煩人。如果讓我來選擇,我喜歡Privilege這個單詞,在我剛使用MySQL的時候就跟它很熟了,所以在我的項目中,我可能會用Privilege來代替Authority。如果我們只使用User-Role兩級關(guān)系,使用RoleVoter默認的ROLE_前綴當然沒有關(guān)系,如果是像白衣這樣是用三層關(guān)系,最好還是把這個前綴改一改,以免混淆。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SpringSide開發(fā)實戰(zhàn)(四):打通數(shù)據(jù)持久層的任督二脈 - 海邊沫沫 - BlogJ...
用Acegi為你的Spring應(yīng)用加把鎖!
Appfuse1.9.3 for springMVC源碼解讀(1)-- 從web.xml
jaas認證提供者 - acegi
Acegi 資源配置動態(tài)擴展實現(xiàn)
SpringSide 對Acegi的擴展應(yīng)用實例
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服