SpringMVC 3.1集成Spring Security 3.1

這篇算是一個入門文章,昨天看見有網友提問,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

截圖01

而後建立一個包新建一個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

截圖02

好了如今能夠啓動了,我這裏啓動的時候很不幸報錯了,一看,缺乏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結構以下:

截圖03

紅色的呢,是源碼包,咱們不用加入,藍色圈中的是兩個例子、你能夠部署學習一下。其餘的就是咱們須要的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配置文件。

具體完整的目錄結構以下:

截圖04

下面咱們啓動web看看會發生什麼神奇的事情。下面咱們訪問http://localhost:8080/SpringMVC/welcome

截圖06

奇蹟發生了,咱們並無建立登錄頁面,那這個登錄頁面哪裏來的呢?哈哈,不要着急,慢慢來說,看看url spring_security_login ,還記得咱們前面配置的spring security 的配置文件的<http>這個配置默認會開啓幾個過濾器,其中有一個就是攔截髮現咱們沒登錄而後查找登錄頁面,但爲何自動出來呢?其是它爲 咱們默認了一個登錄頁面,登錄頁面咱們能夠指定一個,前面咱們沒指定因此檢查發現沒有它就默認了一個登錄頁面給咱們,下面咱們登錄看看會發生什麼狀況。 (什麼你不知道帳號密碼?其實就是咱們spring security配置的那個帳號密碼)。

輸入帳號密碼結果:

截圖07

跳轉到了咱們剛剛要訪問的uri了,中間還會檢查咱們的帳號是否有權,有權纔會訪問成功,無權則會轉到無權訪問頁面。好了,到這裏spring mvc+spring security 集成就完成了,剩下的工做就是一步一步的慢慢學習spring security 來使用更多的完善的功能。簡單吧,就這點東西。

到這裏咱們再試試若是登陸一個不存在的帳號會發生什麼狀況、我輸入了一個admin、結果出現以下圖:

截圖08

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看看會發生神馬變化。如圖:

截圖10

咦?這是什麼狀況?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

不幸的事情又發生了,控制檯報錯,服務器啓動失敗!以下圖:

截圖11

截圖12

其實大概的意思是講下面的這個配置做廢了。

<!--對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

截圖13

當咱們再次訪問的時候login.jsp已經出來了、這個時候咱們登錄,成功後直接跳轉到/welcome 的響應頁面。結果如圖;

截圖14

這裏咱們沒有配置用戶資源訪問權限,因此訪問的資源直接能夠訪問,若是配置了訪問權限登錄成功後,spring security還會檢查是否有權訪問,無權重定向。

 

好了到這裏,今天分享的入門到此完畢。後面有時間再慢慢分享,這個框架仍是很值得學習的。功能比較強大,官方文檔比較全面,能夠好好研讀一下,感謝抽寶貴的時間閱讀。

 

轉自:http://www.cnblogs.com/Beyond-bit/p/springmvc_and_springsecurity.html

相關文章
相關標籤/搜索