這篇算是一個入門文章,昨天看見有網友提問,spring mvc集成spring security 的時候出錯,揣測了一下問題木有解決。我就幫忙給搭建了一個集成框架他說能夠,他告訴我這樣的文章網上少。今天我就分享在這裏供入門學習。spring mvc我木有用過,因此咱們這裏重點講解如何集成spring security ,spring security是一個很是好的開源權限框架(具體瞭解本身google,或者到spring 官網,這裏我給一個DOC3.1:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity.html)。 能夠說不只僅包含了權限,裏面有一套完整的受權認證系統包括:權限、防止session攻擊、支持信道安全、支持LDAP認證、支持OpenID、同時支 持CAS集成單點登陸等等,我的用過spring security 2.0基本大體同樣,當時中文資源那個少啊,尤爲集成SSH+spring security 更是少的可憐,最後仍是硬着頭皮上,最後拿下了這個框架,最起碼瞭解了。當時就寫了一個SSH+spring security的文章,還被某網站引用。好了廢話不扯,咱們今天在來集成一個springmvc3.1+spring security3.1.咱們step by step go。css
step1:搭建SpringMVC。html
若是你會搭建或者搭建好了spring MVC那這一步能夠略過了。首先下載spring mvc3.1 jar這個到官網下載或者google,須要的jar如圖:java
而後建立一個包新建一個spring mvc 的class、個人以下:web
@Controller public class RestConstroller { public RestConstroller() {} @RequestMapping(value = "/welcome", method = RequestMethod.GET) public String registPost() { return "/hello"; } }
上面採用spring 註解方式實例化class,這個我很少講,spring mvc也沒用過不敢亂點。官網有例子你本身照着作。http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/validation.html#format-configuring-FormattingConversionService正則表達式
接着新建了一個view試圖放了一個hello.jspspring
而後新建一個spring-servlet.xml 這個是spring mvc的一個配置文件。數據庫
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" 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.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 啓動註解驅動的Spring MVC功能,註冊請求url和註解POJO類方法的映射--> <mvc:annotation-driven /> <!-- 啓動包掃描功能,以便註冊帶有@Controller、@Service、@repository、@Component等註解的類成爲spring的bean --> <context:component-scan base-package="com.mvc.test" /> <!--這個包根據本身的項目來配置,個人是com.mvc.test--> <!-- 對模型視圖名稱的解析,在請求時模型視圖名稱添加先後綴 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp" /> </beans> 而後配置web.xml: <context-param> <param-name>contextConfigLocation</param-name> <!-- 應用上下文配置文件 --> <param-value>/WEB-INF/spring-servlet.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置spring核心servlet --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- url-pattern配置爲/ 攔截 --> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
項目具體結構:spring-mvc
好了如今能夠啓動了,我這裏啓動的時候很不幸報錯了,一看,缺乏logger的jar,添加commons-logging-1.1.jar,ok啓動訪問http://localhost:8080/SpringMVC/welcome成功、安全
到這裏spring mvc配置完成。下面咱們的重點集成spring security 3.1服務器
step 2 spring mvc3.1集成spring security 3.1
首先要講一點大版本集成要注意一點,大版本號要保持一直,第一位的每每都是大版本號,小版本號影響不大。爲何要這樣講,當時我在集成SSH 的時候spring 用的是spring 2.X,而後去下載了一個spring security 3.X的死活不成功。後來在一片老外的文章中發現了,具體地址我忘記了,spring 2.X +spring security 2.X才能集成功,spring 3.X +spring security 3.X才能集成成功。如今想一想真夠二的、哈哈,好了小插曲事後,咱們繼續。
首先下載spring security 3.1jar,地址:http://www.springsource.org/spring-community-download。我這裏有曾今下載的,就不用了、jar結構以下:
紅色的呢,是源碼包,咱們不用加入,藍色圈中的是兩個例子、你能夠部署學習一下。其餘的就是咱們須要的jar,能夠根據包名稱發現各個包都是一個spring security 的特性,通常來講咱們把jar都加進去,隨着項目須要都會用到的。
接下來咱們須要新建一個applicationContext-security.xml文件,這個是spring security 配置必須的一個文件。內容以下:
<?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.1.xsd"> <!-- 開啓默認的攔截器 --> <http auto-config='true'> <!-- 容許訪問的uri --> <intercept-url pattern="/**" access="ROLE_USER" /> </http> <!-- 權限管理者 --> <authentication-manager> <!-- 權限提供者 --> <authentication-provider> <!-- 可提供登錄訪問的用戶 --> <user-service> <user name="haha" password="haha" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="xixi" password="xixi" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager> </b:beans>
裏面大概解釋了一下,其中http節點裏面默認的開啓的幾個必須的攔截器,下面的user-service 就是能夠登錄訪問的用戶列表,咱們這裏沒有用數據庫因此就這樣配置了,若是使用數據庫 配置一個dataSource便可,包括後面的authorities都是經過數據庫管理用戶權限的,這裏咱們暫時入門不作深刻講解。
而後咱們須要一個spring security 的過濾器配置、web.xml完整配置。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <!-- 應用上下文配置文件 --> <param-value>/WEB-INF/spring-servlet.xml,/WEB-INF/applicationContext-security.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- spring securit start --> <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> <!-- spring securit start --> <!-- 配置spring核心servlet --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- url-pattern配置爲/,不帶文件後綴,會形成其它靜態文件(js,css等)不能訪問。如配爲*.do,則不影響靜態文件的訪問 --> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
其中springSecurityFilterChain 過濾器必須放在最前面,由於spring security的安全機制是保護在web最外層的安全框架,因此你的任何訪問都要通過spring security 投票機制受權才能夠訪問的,不然不容許訪問。只有登錄用戶才能夠訪問。
contextConfigLocation配置就是掃描咱們的spring mvc和spring security配置文件。
具體完整的目錄結構以下:
下面咱們啓動web看看會發生什麼神奇的事情。下面咱們訪問http://localhost:8080/SpringMVC/welcome
奇蹟發生了,咱們並無建立登錄頁面,那這個登錄頁面哪裏來的呢?哈哈,不要着急,慢慢來說,看看url spring_security_login ,還記得咱們前面配置的spring security 的配置文件的<http>這個配置默認會開啓幾個過濾器,其中有一個就是攔截髮現咱們沒登錄而後查找登錄頁面,但爲何自動出來呢?其是它爲 咱們默認了一個登錄頁面,登錄頁面咱們能夠指定一個,前面咱們沒指定因此檢查發現沒有它就默認了一個登錄頁面給咱們,下面咱們登錄看看會發生什麼狀況。 (什麼你不知道帳號密碼?其實就是咱們spring security配置的那個帳號密碼)。
輸入帳號密碼結果:
跳轉到了咱們剛剛要訪問的uri了,中間還會檢查咱們的帳號是否有權,有權纔會訪問成功,無權則會轉到無權訪問頁面。好了,到這裏spring mvc+spring security 集成就完成了,剩下的工做就是一步一步的慢慢學習spring security 來使用更多的完善的功能。簡單吧,就這點東西。
到這裏咱們再試試若是登陸一個不存在的帳號會發生什麼狀況、我輸入了一個admin、結果出現以下圖:
spring security已經幫咱們檢查了,帳號不存在,他會把咱們繼續重定向到登陸頁面,知道登陸成功,不然你永遠都面對的是這個登陸頁面。
好了今天主要分享的就這點,師傅引進門修行靠我的。不過我想了想,仍是再分享一點有用的、有的人會想若是個人登陸頁面須要自定義怎麼辦?下面咱們就講講。
首先自定義登錄,咱們須要修改applicationContext-security.xml 配置文件,修改以下:
<!-- 開啓默認的攔截器 --> <http auto-config='true'> <!-- 容許訪問的uri --> <intercept-url pattern="/**" access="ROLE_USER" /> <!-- 登錄頁面配置 --> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true"/> </http> <!-- 權限管理者 --> <authentication-manager> <!-- 權限提供者 --> <authentication-provider> <!-- 可提供登錄訪問的用戶 --> <user-service> <user name="haha" password="haha" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="xixi" password="xixi" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager>
其中就多加 了一個form 配置節點,從命名能夠看出login-page就是你的登錄頁面,default-target-url是默認的登錄成功後的頁 面,authentication-failure-url就是當你輸入非法帳號或者密碼自動重定向到login.jsp.
接下來建立咱們自定義的登錄頁面,個人就是login.jsp,有人到這裏會想,form接下來該如何寫呢?怎麼寫才能被攔截呢?以下:
<h1>user login</h1> <form action="j_spring_security_check" method="post"> 用戶名<input type="text" name="j_username"/><br/> 密碼<input type="password" name="j_password"/><br/> <input type="submit" value="submit"/> </form>
action="j_spring_security_check"必須這樣寫,不然攔截器攔截不到。登錄的字段j_username j_password必須這樣寫,不然你的登錄攔截器獲取不到value。固然你也能夠自定義,但前提是你必須繼承 UsernamePasswordAuthenticationFilter 過濾器去重寫一下,這裏咱們就不麻煩了,並且通常狀況下咱們不須要重寫,就用它提供的便可。好了,到這裏咱們能夠啓動服務器了。咱們再次訪問:http://localhost:8080/SpringMVC/welcome看看會發生神馬變化。如圖:
咦?這是什麼狀況?url變了,是咱們要訪問的登錄地址。但是頁面的登錄form呢?不要着急,這種狀況我當時見多了,第一反應login.jsp 沒有被放行,攔截下來了、受保護的資源。前面咱們不是講過spring security 是保護在web最外層的嘛,訪問任何資源須要投票,受權才能訪問的,這個也不例外。
好了,知道神馬狀況了,咱們修改吧!修改以下部分片斷便可:
<!-- 開啓默認的攔截器 --> <http auto-config='true'> <!--對login.jsp放行,不用保護--> <intercept-url pattern="/login.jsp" filters="none" /> <!-- 容許訪問的uri --> <intercept-url pattern="/**" access="ROLE_USER" /> <!-- 登錄頁面配置 --> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true"/> </http>
而後咱們啓動服務器再次訪問http://localhost:8080/SpringMVC/welcome
不幸的事情又發生了,控制檯報錯,服務器啓動失敗!以下圖:
其實大概的意思是講下面的這個配置做廢了。
<!--對login.jsp放行,不用保護-->
<intercept-url pattern="/login.jsp" filters="none" />這個配置是spring security 2.X中的,3.X之後做廢了,使用新的方式了。但最起碼你讓我不能再次調用撒,這樣我就知道沒有這個標籤了,能夠理解的是,廢棄相關配置要耗費很大的精 力,動一發而牽全身,因此它還能夠調用,可是運行的時候就不能。不過錯誤告訴咱們怎麼使用新的標籤了,就是新建一個節點標籤,屬性 security="none" 來放行,好了,咱們修改一下。修改部分配置以下:
<!-- spring securit 3.X新的資源放行配置方式,不受保護的資源 --> <http pattern="/login.jsp" security="none"/> <!-- 開啓默認的攔截器 --> <http auto-config='true'> <!-- 容許訪問的uri --> <intercept-url pattern="/**" access="ROLE_USER" /> <!-- 登錄頁面配置 --> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true"/> </http>
在http節點上面再加一個節點,而後配置不須要攔截的。pattern屬性的意思就是經過正則表達式來匹配的。security="none"就 是不安全的,意思就是不受spring security保護的資源,這裏還要提一點,就是.jpg、.gif、.swf、.css、.js/等等資源文件都會被攔截下來,即便他是包含在一個已 經放行的jsp頁面或者uri的request、怎麼理解?就是好比:咱們的login.jsp放行了,可是咱們沒有放行.jpg這樣的圖片資源,當咱們 訪問login.jsp的時候圖片是不顯示的,由於它沒有被放行,從這裏能夠看出spring security是很是嚴格的檢查機制。假如咱們要放行那些怎麼辦?
spring security 2.X中配置以下:
<http auto-config='true'> <!-- public 資源文件 –> <intercept-url pattern="/**/*.jpg" filters="none" /> <intercept-url pattern="/**/*.png" filters="none" /> <intercept-url pattern="/**/*.gif" filters="none" /> <intercept-url pattern="/**/*.ico" filters="none" /> <intercept-url pattern="/**/*.css" filters="none" /> <intercept-url pattern="/**/*.js" filters="none" /> <!-- 容許訪問的uri --> <intercept-url pattern="/**" access="ROLE_USER" /> <!-- 登錄頁面配置 --> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true"/> </http>
固然咱們這裏講spring security 3.X,因此3.X的以下:
<http pattern="/**/*.jpg" security="none"/> <http pattern="/**/*.png" security="none"/> <http pattern="/**/*.gif" security="none"/> <http pattern="/**/*.ico" security="none"/> <http pattern="/**/*.css" security="none"/> <http pattern="/**/*.js" security="none"/> <!-- spring securit 3.X新的資源放行配置方式,不受保護的資源 --> <http pattern="/login.jsp" security="none"/> <http auto-config='true'> <!-- 容許訪問的uri --> <intercept-url pattern="/**" access="ROLE_USER" /> <!-- 登錄頁面配置 --> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true"/> </http>
上面的pattern="/**/*.jpg" 配置意思就是放行,項目中全部的.jpg資源,之後的以此類推的原理。你亦能夠放行某一個文件下的,具體就是正則表達式的配置。
好了,咱們仍是回到剛剛修改的放行資源試試,再次啓動服務器訪問:http://localhost:8080/SpringMVC/welcome
當咱們再次訪問的時候login.jsp已經出來了、這個時候咱們登錄,成功後直接跳轉到/welcome 的響應頁面。結果如圖;
這裏咱們沒有配置用戶資源訪問權限,因此訪問的資源直接能夠訪問,若是配置了訪問權限登錄成功後,spring security還會檢查是否有權訪問,無權重定向。
好了到這裏,今天分享的入門到此完畢。後面有時間再慢慢分享,這個框架仍是很值得學習的。功能比較強大,官方文檔比較全面,能夠好好研讀一下,感謝抽寶貴的時間閱讀。
轉自:http://www.cnblogs.com/Beyond-bit/p/springmvc_and_springsecurity.html