云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Acegi 開源安全認證 解決方案 學習研究 I

          Posted on 2007-03-07 13:00 云自無心水自閑 閱讀(1645) 評論(0)  編輯  收藏 所屬分類: Java 、心得體會Acegi

          ??? Acegi提供了一個優秀的基于J2EE企業級應用的安全認證機制。尤其是對于Spring框架的支持,在J2EE的企業軟件開發解決方案中是領先的。
          ??? 來看一下Acegi的重要的共享組件。如果組件是框架的核心而且一旦缺少這些組件框架將無法運轉,那么這些組件可以稱為是“共享”的。這些Java類型是系統其他部分的基礎,所以理解他們是十分重要的,雖然你可以并不會直接與之互動。

          ??? 其中最基礎的對象是SecurityContextHolder,用于存儲應用安全上下文的細節信息。缺省情況下,SecurityContextHolder使用ThreadLocal來存儲信息,這意味著安全上下文對于同一個線程的所有方法都是有效的。有一些應用不適合使用ThreadLocal,比如:一個Swing的客戶端可能希望所有JVM所有的線程都使用相同的安全上下文。對于這種情況,你可以用SecurityContextHolder.MODE_GLOBAL。你可以把SecurityContextHolder從缺省模式MODE_THREADLOCAL改變為MODE_GLOBAL。

          ??? 在SecurityContextHolder中存儲了與應用互動的規則。Acegi使用Authentication對象來表示這些信息。這并不是需要你自己創建Authentication對象,更通常的做法是查詢到一個Authentication對象。舉例如下,在應用的任何一個地方都可以這樣使用:

          Object obj = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
          if( obj instanceof UserDetails){
          ?String username=((UserDetails)obj).getUsername();
          }else{
          ?String username=obj.toString();
          }

          ??? 上面這段代碼介紹了不少有意思的對象和關系。首先,大家會發現在SecurityContextHolder和Authentication之間存在著一個即時對象:SecurityContext,SecurityContextHolder.GetContext()返回的類型就是SecurityContext。Acegi有數個SecurtiyContext的實現。

          ??? 另一個值得注意的是我們從Authentication中獲得了一個規則。這個規則的類型是:Object。大多數情況下,我們可以把它強制性轉換成UserDetails對象。UserDetails是Acegi的核心接口。它代表了一種規則,但是經過了應用相關的擴展。可以把UserDetails想象成為應用數據庫與Acegi的SecurityContextHolder需要的兩者之間的適配器(Adapter)。如果作為應用自己的數據庫的代表,那么可以把UserDetails強制性轉換為其原始類,這樣,你就可以調用其中的業務方法(比如:getEmail()等等)。

          ??? 那么,為什么要提供一個UserDetails對象呢?是這樣的:有一個特殊的接口:UserDetailsService,這個接口只有一個方法,這個方法接收一個String類型的表示用戶名的參數,返回UserDetails對象。大多數認證提供provider裝配一個代理到UserDetailsService上。UserDetailsService被用于創建SecurityContextHolder中存儲的Authentication對象。Acegi中提供了若干個UserDetailsService的實現,一個使用內存Map,一個用JDBC。大多數用戶傾向于寫一個自己的實現,通常是使用DAO。不論UserDetailsService返回的是什么,都可以通過SecurityContextHolder獲得。


          ??? Authentication提供另一個重要的方法是getAuthorites()。這個方法返回一個GrantedAuthority對象的數組。GrantedAuthority是授權給的認證。這個認證通常指的是“角色”,比如:ROLE_ADMINISTRATOR或者ROLE_HR_SUPERVISOR。這些角色需配置用于web認證,方法認證和域對象認證。如果Acegi的其他部分希望看到這些認證,那么UserDetailsService返回GrantedAuthority對象即可。

          ??? 最后,有時你需要在HTTP requests之間傳遞SecurityContext,有時每次請求都需要重新認證。那么可以使用HttpSessionContextIntergrationFilter,這是用于在HTTP Request之間傳遞SecurityContext的東東。就象名稱所表示的那樣:HttpSession用于存儲這些信息。但是你不需要直接操作HttpSession。



          主站蜘蛛池模板: 桃园县| 永春县| 鸡西市| 枣强县| 兴和县| 陆丰市| 宣城市| 民和| 日照市| 句容市| 萍乡市| 大理市| 新巴尔虎左旗| 门头沟区| 南昌市| 丰都县| 弥渡县| 丘北县| 惠安县| 九江县| 安新县| 大洼县| 芮城县| 林甸县| 阿图什市| 赤壁市| 治多县| 老河口市| 安化县| 通河县| 富平县| 始兴县| 白河县| 南丰县| 高碑店市| 鄂托克旗| 宜黄县| 渑池县| 绍兴县| 奉化市| 和田市|