云自無心水自閑

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

          日歷

          <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          隨筆檔案

          積分與排名

          • 積分 - 1127751
          • 排名 - 27

          最新評論

          ??? 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。



          主站蜘蛛池模板: 西乡县| 保德县| 客服| 林口县| 井研县| 奈曼旗| 涞源县| 陆河县| 遵化市| 望奎县| 黄山市| 西林县| 凌云县| 双桥区| 台山市| 遵义市| 彭山县| 紫金县| 永定县| 和顺县| 措美县| 新乡市| 杨浦区| 澎湖县| 南雄市| 濮阳市| 青海省| 峨边| 韶山市| 嘉善县| 什邡市| 乐安县| 东兴市| 柳河县| 徐闻县| 东莞市| 策勒县| 屯留县| 集贤县| 随州市| 永胜县|