隨筆-54  評論-0  文章-2  trackbacks-0
           接著昨天的實現將攔截的url,權限信息,用戶信息放到數據庫中,并將spring-security集成到項目中

          1. 實現資源信息存放到數據庫中:

          訪問資源時, spring-security 能區分出訪問該資源需要哪些權限
            1. 自定義ObjectDefinitionSource 接口的實現類, 將該類的實例裝配給 FilterSecurityInterceptor 的 objectDefinitionSource 的屬性. 即可實現自定義的資源獲取.

            2. 通過繼承 DefaultFilterInvocationDefinitionSource 類的方法定義ObjectDefinitionSource 接口的實現類有困難, 因為 DefaultFilterInvocationDefinitionSource中沒有無參的構造器

             3.通過查看 spring-security 核心 jar 包的 META-IN 下 的 spring.handlers 找到 SecurityNamespaceHandler, 在該類中查看 registerBeanDefinitionParser(Elements.HTTP, new HttpSecurityBeanDefinitionParser()); 方法在 HttpSecurityBeanDefinitionParser 類中可以看到如何創建 DefaultFilterInvocationDefinitionSource 實例.

             4. 通過 FactoryBean 在 IOC 容器中注冊  DefaultFilterInvocationDefinitionSource 實例   

             5. 實現ResourceDetailsService 接口    

          2.關于MD5加密:

          1.網上的關于MD5已經很多了,MD5算法對密碼進行摘要加密,這是一種單項加密手段,無法通過加密后的結果反推回原來的密碼明文。

          為了使用MD5對密碼加密,我們需要修改一下配置文件
          <authentication-provider>
              <password-encoder hash="md5" >
              <jdbc-user-service data-source-ref="dataSource" >
          < authentication-provider>  
          上述代碼中新增的黃色部分,將啟用md5算法。

          3.管理會話(HttpSession)
              多個用戶不能使用同一個賬號同時登陸系統。
          添加監聽器
          在web.xml中添加一個監聽器,這個監聽器會在session創建和銷毀的時候通知Spring Security。
          這種監聽session生命周期的監聽器主要用來收集在線用戶的信息,比如統計在線用戶數之類的事。后登陸的將先登錄的踢出系統默認情況下,后登陸的用戶 會把先登錄的用戶踢出系統。

          ============================================================================================
                                        集成spring-security框架

          1. 集成 spring-security 框架

              1. 加入 spring-security 的兩個 jar 包
              2. 在 web.xml 文件中加入加入 spring-security 框架的過濾器
              3. 新建 applicationContext-security.xml 配置文件,并且把 security 作為默認的命名空間, 并將其導入到 applicationContext.xml 中
              4. 設計領域模型:
                 Authority -- 權限
                 Resource -- 資源
                 Role -- 角色
                 Employee -- 添加 Set<Role> roleSet 屬性

                 Resource 和 Authority 為多對多的對應關系
                 Authority 和 Role 為多對多的對應關系
                 Role 和 Employee 為多對多的對應關系
          需要 3 個關聯表
              5.
                 1. 修改當前系統的 login.jsp 頁面, 改為 spring-security 的登錄頁面, 并且在 <http> 節點中進行配置.
          注意: spring-security 在登錄成功后, 利用 "重定向" 轉到 form-login 節點對應的 default-target-url 屬性對應的頁面. 所以不能直接將其配置為 WEB-INF 目錄下的任何頁面
                2. 新建 UserDetailsService 接口的實現類, 以實現從數據庫中獲取用戶信息(需要查詢 Employee, Role, Authority, 參見 spring-security-2 的UserDetailsServiceImpl, 基于 Hibernate 實現),并把該類的 Bean 引用裝配給 <authentication-provider> 節點的 user-service-ref 屬性 
              6. 向 ems_resource_table, ems_authority_table, ems_resource_authority_table 數據表中添加數據
              7. 新建 ResourceDetailsService 接口的實現類, 實現從數據庫中讀取需要被保護的資源信息及其可以訪問這些資源的權限信息
              8. 利用 FactoryBean 新建 DefaultFilterInvocationDefinitionSource 接口的 Bean, 并把  ResourceDetailsService 的 Bean 注入進來, 再把該 Bean 配置為 filterSecurityInterceptor 過濾器的 objectDefinitionSource 屬性

          2. 實現權限模塊:
           1. 實現 Role 的增, 刪, 改, 查

                  角色的添加:

                頁面 UI:
                        a. 對字段的 jQuery validation 驗證
                        b. struts validator 驗證 **
                        c. Action的復雜驗證: 角色名不能重復 **.
                        d. 角色名的 ajax 驗證, 角色名不能重復 **.
                        e. 勾選權限時的級聯選擇. 例如: 勾選 "員工刪除" 的同時必須勾選 "員工查詢", 即不能讓用戶只有 "員工刪除" 權限, 而沒有 "員工查詢" 權限.
                        f. 使用到 Authority 的如下兩個字段: relatedAuthorites(與當前權限關聯的權限信息, 多個權限使用 "," 分隔), parentAuthority(當前權限的父權限)
          subAuthorities(當前權限的子權限)            
                 若驗證都通過, 在 Action 中受理請求, 錄入角色
             
          注意:

                 不能通過以下代碼獲取 parentAuthority 為 null 的 Authority 集合
                 List list = authorityDao.findBy("parentAuthority", null);
                 System.out.println(list.size());
          而應該使用:

                 List list = authorityDao.find("FROM Authority auth WHERE auth.parentAuthority IS null");
              為 #select 添加 change 相應事件, 當選取某個父權限時, 子權限顯示


          今天就此為止,明天繼續!
          posted on 2010-03-13 23:21 d66380022 閱讀(1179) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 内乡县| 西吉县| 湘阴县| 多伦县| 铁力市| 朔州市| 攀枝花市| 平远县| 广宗县| 化德县| 建阳市| 保靖县| 汶川县| 丹棱县| 旬邑县| 仁寿县| 义马市| 固镇县| 阳城县| 本溪| 洪雅县| 永新县| 广灵县| 棋牌| 隆安县| 东宁县| 成都市| 潜山县| 宁强县| 邳州市| 万山特区| 宁陵县| 石屏县| 永清县| 建德市| 南漳县| 高陵县| 东乌| 北辰区| 虎林市| 壶关县|