日期:2014-05-16  浏览次数:20481 次

Spring Security 3.0数据库动态实现权限控制
第一次接触Spring Security,在网上找了很多资料,有简单示例的,就是把用户名及权限信息配置在XML里面,但这种不太适合一般的项目!有些资料是翻译源代码讲解各个过滤器的作用以及其工作原理!由于项目时间紧所以求成心切的我看这些资料的时候总是很匆忙的跳步来看,到最后反而稀里糊涂,脑子里更乱,真心的希望有个狄仁杰中的元芳能在身边,这样我还能听取下他的意见:"元芳,你怎么看!"这两天静下来把之前看的那些详细看了看,最后感觉这玩意儿也不是那么那么让人抓狂!

开发环境 SpringIDE 3.0、Spring Security 3.0.2、myibatis、Maven、MySql
最前面的spring配置以及Maven管理架包、myibatis的配置就不说了
首先:
1、需要将所需要的JAR包在pom中配置

2、在web.xml中添加spring security的过滤链
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

3、添加applicationContext-security.xml到根目录下
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns="http://www.springframework.org/schema/security"
 xmlns:b="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.0.xsd">

	<!-- <global-method-security pre-post-annotations="enabled" /> -->
	
	<!-- access-denied-page配置访问失败页面 -->
	<http auto-config="true" access-denied-page="/accessDenied.htm">
		<!-- 不要过滤图片等静态资源,其中**代表可以跨越目录,*不可以跨越目录。 -->
		  <intercept-url pattern="/**/*.jpg" filters="none" />
		  <intercept-url pattern="/**/*.png" filters="none" />
		  <intercept-url pattern="/**/*.gif" filters="none" />
		  <intercept-url pattern="/**/*.css" filters="none" />
		  <intercept-url pattern="/**/*.js" filters="none" />
		  <intercept-url pattern="/login.htm*" filters="none"/>
		  <!-- <intercept-url pattern="/index.htm" access="ROLE_USER,ROLE_ADMIN"/>
 		  <intercept-url pattern="/header.htm" access="ROLE_USER,ROLE_ADMIN"/>
		  <intercept-url pattern="/left.htm" access="ROLE_USER,ROLE_ADMIN"/> -->
		  <intercept-url pattern="/**" access="ROLE_USER"/>
		<!-- 配置登录页面 -->
		<form-login login-page="/login.htm"
			default-target-url="/" authentication-failure-url="/login.htm?error=true"
			login-processing-url="/springSecurityLogin"/>
		<!--"记住我"功能,采用持久化策略(将用户的登录信息存放在数据库表中) -->
		<!-- <remember-me/> -->
		<!-- 用户退出的跳转页面 -->
		<logout logout-success-url="/login.htm" invalidate-session="true" 
			logout-url="/logout" />
		<!-- 会话管理,设置最多登录异常,error-if-maximum-exceeded = false为第二次登录就会使前一个登录失效 -->
		 <session-management invalid-session-url="/error/errorPage.jsp">
			<concurrency-control max-sessions="1" error-if-maximum-exceeded="false" />
		</session-management>
		
		<!--添加自定义的过滤器 放在FILTER_SECURITY_INTERCEPTOR之前有效  -->
		<custom-filter ref="customFilterSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR" />
	</http>
	
	<!-- 配置认证管理器 -->
	<authentication-manager alias="authenticationManager">
		<authentication-provider user-service-ref="customUserDetailsService">
		    <password-encoder hash="md5"/>
			<!-- <jdbc-user-service data-source-ref="dataSource"/> -->
		</authentication-provider>
	</authentication-manager>
</b:beans>

上面是XML文件,需要说明的是:intercept-url节点需至少有一个拦截的,如果全部过滤图片或者是样式这些,spring框架启动的时候,就不会拦截任何URL,因为你没有配置相关的拦截的intercept-url,所以它就以为任何人都可以访问整个资源!


其中的节点用途都有说明,就不在啰嗦
4、创建CustomUserDetailsService、CustomAccessDecisionManager、CustomFilterSecurityInterceptor、CustomInvocationSecurityMetadataSource
这4个类我定义的接口,有相应