<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    京山游俠

    專(zhuān)注技術(shù),拒絕扯淡
    posts - 50, comments - 868, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

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

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

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

    Acegi中提供的Filter不少,有十多個(gè),一個(gè)一個(gè)學(xué)起來(lái)比較復(fù)雜。但是對(duì)于我們Web開(kāi)發(fā)者來(lái)說(shuō),常用的就那么幾個(gè),如下圖中的被紅圈圈標(biāo)記出來(lái)的:
    002.PNG

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

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

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

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

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

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

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

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

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

    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;

    /**
    ?*?實(shí)現(xiàn)SpringSecurity的UserDetailsService接口,獲取用戶(hù)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類(lèi)中沒(méi)有enabled,?accountNonExpired,credentialsNonExpired,?accountNonLocked等屬性
    ????????
    // ?暫時(shí)全部設(shè)為true,在需要時(shí)才添加這些屬性.
    ????????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;
    ????}
    }


    最后再來(lái)說(shuō)說(shuō)這個(gè)命名的問(wèn)題,我對(duì)Authentication和Authority這兩個(gè)單詞比較反感,兩個(gè)原因,一是因?yàn)樗鼈兲Я耍且驗(yàn)樗鼈冮L(zhǎng)得太像了,明明一個(gè)是認(rèn)證,一個(gè)是授權(quán),意思相差很遠(yuǎn),外貌卻如此相似,確實(shí)很煩人。如果讓我來(lái)選擇,我喜歡Privilege這個(gè)單詞,在我剛使用MySQL的時(shí)候就跟它很熟了,所以在我的項(xiàng)目中,我可能會(huì)用Privilege來(lái)代替Authority。如果我們只使用User-Role兩級(jí)關(guān)系,使用RoleVoter默認(rèn)的ROLE_前綴當(dāng)然沒(méi)有關(guān)系,如果是像白衣這樣是用三層關(guān)系,最好還是把這個(gè)前綴改一改,以免混淆。

    評(píng)論

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-08 10:15 by 楊?lèi)?ài)友
    以前看過(guò)這個(gè)安全框架,覺(jué)得配置太復(fù)雜,放棄使用了,今天叫你說(shuō)的這么簡(jiǎn)單,回頭再看一下。

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-08 11:12 by regale
    謝謝!

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-08 11:17 by leekiang
    挺奇怪的,權(quán)限的前綴為什么要用"ROLE_"呢,我覺(jué)得用"PRIVILEGE_"或者"AUTHORITY_"比較恰當(dāng)。

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-08 20:11 by 火線(xiàn)生存
    講得非常通俗,對(duì)Spring Security又理解一層了。非常感謝!

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-10 08:46 by 淘聲依舊
    簡(jiǎn)單多了

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-11 22:33 by 有點(diǎn)不明白!
    這些是簡(jiǎn)化了配置,不過(guò)我還是不明白, 如何把 所有的權(quán)限和角色都定義在數(shù)據(jù)庫(kù)中,常常在開(kāi)發(fā)中 角色是可以維護(hù)的, 而且 較大的項(xiàng)目 權(quán)限這樣配置工作量太大。有沒(méi)有什么好的辦法。

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-24 13:15 by 海邊沫沫
    補(bǔ)充:

    前文所講的是我對(duì)Acegi的一些理解,我認(rèn)為只有把條理搞清楚了,才更容易深入。我想得比較簡(jiǎn)單,當(dāng)然會(huì)漏掉一些細(xì)節(jié)。這里把它補(bǔ)充一下。

    1、我上面講到的主要內(nèi)容,包含了認(rèn)證和授權(quán),但是漏掉了資源,資源就是我們需要保護(hù)的URL,或者一些類(lèi)中的方法。要保護(hù)URL,在xml文件中按照前面的例子配置就可以了,要保護(hù)類(lèi)中的方法,使用@secured就可以了。
    但是它們是和Acegi中的哪個(gè)組件關(guān)聯(lián)起來(lái)的呢?是FilterSecurityInterceptor和MethodSecurityInterceptor,這兩個(gè)Interceptor都需要設(shè)置一個(gè)叫objectDefinitionSource的屬性。所以,有人要問(wèn),如何把對(duì)資源的保護(hù)設(shè)置全部轉(zhuǎn)移到數(shù)據(jù)庫(kù)中,避免寫(xiě)在xml中,那就要從這個(gè)objectDefinitionSource著手了。

    2、前面講到了UserDetailService,事實(shí)上在Acegi中還需要配置別的Service,如RememberMeService,當(dāng)然,該Service也是現(xiàn)成的,不需要我們寫(xiě)代碼的,RememberMeProcessingFilter需要依賴(lài)這個(gè)Service。

    3、Acegi支持OpenID和CAS 3,這兩個(gè)東西是干什么的呢?是可以實(shí)現(xiàn)單點(diǎn)登錄功能的,也就是允許用戶(hù)只登錄一次,就可以使用多個(gè)網(wǎng)站。這對(duì)于那些很龐大的網(wǎng)站非常有用,可以把用戶(hù)登錄這樣的操作集中在一臺(tái)服務(wù)器上。要使用CAS,只需要配置Filter時(shí)選擇CASProcessingFilte,配置Provider時(shí)選擇CasAuthenticationProvider,其余的概念都是相通的。具體的實(shí)現(xiàn)細(xì)節(jié),大家慢慢摸索吧。

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-24 15:44 by 虎嘯龍吟
    講的比較清楚、透徹!但有幾個(gè)問(wèn)題:
    IS_AUTHENTICATED_ANONYMOUSLY、ROLE_MODIFY_USER等 有什么作用?由誰(shuí)定義啊?

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2008-12-24 20:16 by 海邊沫沫
    @虎嘯龍吟
    這些是我們自己定義的。用戶(hù)、角色、授權(quán)都是開(kāi)發(fā)者自己定義的,在SpringSide中,這些東西是用數(shù)據(jù)庫(kù)保存的,而資源和授權(quán)的關(guān)系,是定義在xml文件中的,就是你看到的配置文件的內(nèi)容。

    # 沫沫幫忙看看這個(gè)文題吧,幫忙解決一下吧  回復(fù)  更多評(píng)論   

    2009-01-06 16:45 by playingfly
    沫沫幫忙看看這個(gè)文題吧,也是關(guān)于安全認(rèn)證登陸的,幫忙解決一下吧 ,十分感謝了!!!

    http://forum.springside.org.cn/viewthread.php?tid=3352&extra=page%3D1

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2009-01-12 19:18 by 江南白衣
    ROLE_的前綴,貌似不大容易改掉啊,誰(shuí)改過(guò)的告訴一下方法,的確很容易讓人混淆。

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2009-01-13 16:58 by yzl45
    在這里要強(qiáng)調(diào)一點(diǎn),acegi已經(jīng)不存在了,在1.0X以后,就叫做Spring Security了,這個(gè)是官方的正式更名。
    “ROLE_”這個(gè)前綴是Spring Security一個(gè)默認(rèn)的前綴,如果不想用,可以替換它,提換的方法是:
    <beans:bean id="accessDecisionManager" class="org.springframework.security.vote.AffirmativeBased">
    <beans:property name="allowIfAllAbstainDecisions" value="false"/>
    <beans:property name="decisionVoters">
    <beans:list>
    <beans:bean class="org.springframework.security.vote.RoleVoter">
    <beans:property name="rolePrefix" value="替換成你想要的前綴"></beans:property>
    </beans:bean>
    <beans:bean class="org.springframework.security.vote.AuthenticatedVoter"/>
    </beans:list>
    </beans:property>
    </beans:bean>

    # re: SpringSide 3 中的安全框架[未登錄](méi)  回復(fù)  更多評(píng)論   

    2009-01-14 00:20 by 江南白衣
    SpringSide的SVN里ROLE_已經(jīng)改成AUTH_了 :)

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2009-02-01 11:22 by mojiezhong
    實(shí)現(xiàn)“用戶(hù)-用戶(hù)組-角色-授權(quán)”四級(jí)關(guān)系與“用戶(hù)-角色-授權(quán)”關(guān)系難度大嗎?性能影響如何?

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2009-05-08 16:00 by 小k

    很久以前試用了一下acegi1.x版本,,用戶(hù) 角色== 信息都放數(shù)據(jù)庫(kù)里面來(lái),,

    但是問(wèn)題來(lái)了.我想做動(dòng)態(tài)權(quán)限,這個(gè)玩意是使用別人的系統(tǒng)的時(shí)候看到的...

    如果使用的acegi 但標(biāo)簽字頁(yè)面控制了顯示,那么還有辦法讓角色也動(dòng)態(tài)么??

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2012-04-13 09:05 by 熊錦鵬
    斷斷續(xù)續(xù) 看了好久的這個(gè) 直到今天才明白了一點(diǎn) 多謝LZ啊
    不過(guò)還有一個(gè)問(wèn)題,就是取到的權(quán)限,怎么用呢,就是List < GrantedAuthority > authsList 這個(gè)怎么用,是不是這個(gè)集合里放的就是菜單的集合?怎么用?

    # re: SpringSide 3 中的安全框架[未登錄](méi)  回復(fù)  更多評(píng)論   

    2012-09-12 17:03 by lsysbl
    寫(xiě)的太好了。我在網(wǎng)上看了幾十篇,都沒(méi)有看懂。就你這篇我理解了。你真人才。

    # re: SpringSide 3 中的安全框架[未登錄](méi)  回復(fù)  更多評(píng)論   

    2013-01-05 20:22 by alex
    我看了幾天的spring security都不理解,直到看完你的文章,終于大悟了。真是非常感激。

    # re: SpringSide 3 中的安全框架[未登錄](méi)  回復(fù)  更多評(píng)論   

    2013-01-25 12:45 by lh
    非常感謝,只能用一個(gè)大徹大悟來(lái)形容了

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2013-05-27 21:09 by 吳彥欣
    是我看到最詳細(xì)的spring security介紹了,懂了好多,謝謝LZ

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2013-08-30 09:01 by geek
    好文章,支持樓主!!!!

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2014-02-10 15:27 by 845885222@qq.com
    講解還不錯(cuò)的

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2014-02-25 10:32 by 殘風(fēng)
    謝謝樓主分享

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2014-04-14 16:34 by cl
    謝謝分享

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2015-05-14 11:22 by 1057718341
    通俗易懂,寫(xiě)的非常好,感謝樓主分享。

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2015-05-19 17:51 by gfbg
    loil

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2015-05-19 17:53 by gfbg
    說(shuō)了一大堆,我沒(méi)怎么看懂

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2015-09-18 00:10 by
    樓主的文章果然講的好清晰,謝謝分享

    # re: SpringSide 3 中的安全框架  回復(fù)  更多評(píng)論   

    2017-05-10 11:32 by 薄荷檸檬草
    通俗易懂,謝謝樓主
    主站蜘蛛池模板: 亚洲午夜国产精品无码老牛影视| 国产精品区免费视频| 337P日本欧洲亚洲大胆精品| 亚洲av永久无码嘿嘿嘿| 亚洲三级在线播放| 亚洲三级中文字幕| 亚洲天堂免费在线| 亚洲欧美熟妇综合久久久久| 亚洲人成影院在线高清| 亚洲精品亚洲人成在线播放| 亚洲黄页网在线观看| 亚洲精品无码mⅴ在线观看| 亚洲精品乱码久久久久蜜桃 | 亚洲国产精品成人一区| 亚洲精品视频免费观看| 亚洲精品自在在线观看| 久热综合在线亚洲精品| 国产三级在线免费| 免费国产黄网站在线观看动图| 国产精品亚洲а∨天堂2021| 一级毛片免费播放男男| 三上悠亚电影全集免费| 黄色三级三级三级免费看| 丰满妇女做a级毛片免费观看| 中文字幕无线码中文字幕免费| 免费日本一区二区| 成人免费在线看片| 四虎影视成人永久免费观看视频| 九九热久久免费视频| 伊人久久免费视频| 好吊妞在线成人免费| 免费一级毛片在级播放| 亚洲午夜国产精品无码| 亚洲国产成人精品无码区在线秒播| 亚洲男同gay片| 二个人看的www免费视频| 最近中文字幕大全免费视频| 久久青草国产免费观看| 综合在线免费视频| 日产国产精品亚洲系列| 日本xxwwxxww在线视频免费|