接著昨天的實現將攔截的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 相應事件, 當選取某個父權限時, 子權限顯示
今天就此為止,明天繼續!