今天主要實現的是員工信息的修改和權限管理基礎,修改用AJAX實現的,權限看了不少的源代碼,感覺蠻難的,不過今天只是初步介紹,還有時間再學習一下!
1.員工信息的修改
1.struts對表單信息的回顯
2.對可以進行修改的字段
1.當該字段值發生改變時,confirm”確定修改該信息嗎?”
點擊”取消”:使該字段恢復為以前的默認值,不做改變,需要使用隱藏域
點擊“確定”:用AJAX改變字段,在配置文件中不需返回任何信息
<script type=”text/javascript”>
$(function(){
$(“:text,select”).change(function(){
var flag = confirm(“確定要修改” + $(this).prev(“label”).text()+”信息嗎?”);
...});
}):
</script>
信息
2.集成spring-security 框架
1. Spring Security 能用 于保護各種 Java 應 用程序(權限管理框架).
2.spring-security入門
需 求:1. Spring-security 應用的根目錄下有兩個 Jsp 頁面: index.jsp 和 admin.jsp. admin 用戶有權限訪問這兩個頁面, 而 user 用戶只能訪問 index.jsp
2.提供”登出”功能
搭建環境:
首先添加spring環境
1.加入spring-security 的jar 包:
spring-security-2.0.5"dist"spring-security-core-2.0.5.RELEASE.jar
2.在web.xml 文件中加入加入spring-security 框架的過濾器
3.新建applicationContext-security.xml 配置文件,并且把security 作為默認的命名
空間, 并將其導入到applicationContext.xml 中
applicationContext-security.xml中,有幾種重要配置:
1. 配置 spring-security 的 http 安全屬性
<http auto-config="true">
2. 配置需要保護那些 資源, 以及訪問這些資源 所需要的權限, 若有多個 權限使用 ',' 分隔
<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/>
<intercept-url pattern="/index-1.jsp" access="ROLE_USER"/>
3.配置登出服務
<logout logout-url="/logout"
logout-success-url="/loguot-success.jsp"
invalidate-session="false" />
4.配置登錄頁面,
default-target-url: 若直接請求登錄頁面, 那么該屬性配置登錄成功之后的相應頁面
always-use-default-target: 若請求的目標頁面受保護, 則 spring-security 會相應 login-page 屬性對應的頁面, 默認情況下, 若登錄成功將相應剛才請求的目標頁面,
但這相當麻煩,每次都要配置不少信息。下面 有更好的實現,即
把需要攔截的url,權限,用戶信息放到放數據庫中,實現如下:
1.實體類:
Authority -- 權限
Resource -- 資源
Role -- 角色
Employee -- 添加Set<Role> roleSet 屬性
2.關系
Resource 和Authority 為多對多的對應關系
Authority 和Role 為多對多的對應關系
Role 和Employee 為多對多的對應關系
所以還需要3 個額外的關聯表
3.實現把用戶信息,權限信息存放到數據庫中
1. 實現把用戶信息, 權限信息存放到數據庫中
1). 自定義 UserDetailsService 接口的實現類, 將該類配置到 Spring 的 IOC 容器中, 并在
<authentication-provider user-service-ref=""> 節點的 user-service-ref 屬性中引用該 Bean.
2). 通過 debug 查看 UserDetailsService 接口的實現類返回的 UserDetails 對象
4. 實現資源信息存放到數據庫中: 訪問資源時, spring-security 能區分出訪問該資源需要哪些權限
1). 自定義 ObjectDefinitionSource 接口的實現類, 將該類的實例裝配給 FilterSecurityInterceptor 的 objectDefinitionSource 的 屬性.即可實現自定義的資 源獲取.
2). 通過繼承 DefaultFilterInvocationDefinitionSource 類的方法定義 ObjectDefinitionSource 接口的實現類有困難, 因為 DefaultFilterInvocationDefinitionSource
中沒有無參的構 造器, 該構造器有兩個參 數: UrlMatcher urlMatcher, LinkedHashMap requestMap.
urlMatcher 參數可 以通過 bean 的形式 事先配置, 但 requestMap 參數類似于: {[/admin.jsp]=[ROLE_ADMIN], [/index.jsp]=[ROLE_USER]}, 需要訪問數據庫才能對其初始化, 但這不可能.
3). 通過查看 spring-security 核心 jar 包的 META-IN 下的 spring.handlers 找到 SecurityNamespaceHandler, 在該類中查看 registerBeanDefinitionParser(Elements.HTTP, new HttpSecurityBeanDefinitionParser()); 方法
在 HttpSecurityBeanDefinitionParser 類 中可以看到如何創建 DefaultFilterInvocationDefinitionSource 實例.
4). 通過 FactoryBean 在 IOC 容器中注冊 DefaultFilterInvocationDefinitionSource 實例