spring安全框架Security(一)

    如今不少企業和開發團隊都使用了SSH2(Struts 2 +Spring 2.5 +Hibernate)框架來進行開發,  咱們或許已經習慣了強大的Spring Framework 全局配置管理,不能否認,Sping是一個很優秀的開源框架,可是因爲Spring3.0版本後強大的的註解式bean的誕生,Spring MVC框架這匹黑馬正悄然殺起,但今天Spring MVC不是主角,今天我和你們分享一個一樣隸屬於SpringSource 的安全框架——Spring Security, 下面的基於Spring MVC給你們分享一下Spring Security  的使用。雖然對它的接觸時間不長,參考了一些網上朋友的作法,但也按照個人理解把這個框架介紹介紹,不是很專業,還請你們不要介意 。   
html

     咱們知道,Web 應用的安全性包括用戶認證(Authentication)和用戶受權(Authorization)兩個部分。用戶認證指的是驗證某個用戶是否爲系統中的合法主體,也就是說用戶可否訪問該系統。用戶受權指的是驗證某個用戶是否有權限執行某個操做。在一個系統中,不一樣用戶所具備的權限是不一樣的。好比對一個資源來講,有的用戶只能進行讀取,而有的用戶能夠進行修改。通常來講,系統會爲不一樣的用戶分配不一樣的角色,而每一個角色則對應一系列的權限。
java

     首先,咱們看web.xml
web

    Java代碼 spring

<?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">  
    <!-- 編碼統一最好放最上面,最早加載,防止亂碼-->  
    <filter>  
        <filter-name>Set Character Encoding</filter-name>  
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
        <init-param>  
            <param-name>encoding</param-name>  
            <param-value>UTF-8</param-value>  
        </init-param>  
        <init-param>  
            <param-name>forceEncoding</param-name>  
            <param-value>true</param-value><!-- 強制進行轉碼 -->  
        </init-param>  
    </filter>  
  
    <filter-mapping>  
        <filter-name>Set Character Encoding</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
    <!-- 而後接着是SpringSecurity必須的filter 優先配置,讓SpringSecurity先加載,防止SpringSecurity攔截失效-->  
    <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>  
  
    <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
    </welcome-file-list>  
  
    <!--   
    spring須要加載的配置文件  
-->  
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>   
    WEB-INF/classes/applicationContext.xml,  
    WEB-INF/spring3-servlet.xml,  
    WEB-INF/spring-security.xml   
        </param-value>  
    </context-param>  
  
    <listener>  
        <listener-class>  
            <!--     因此,要在web.xml下面配置好監聽,讓服務器啓動時就初始化改類,能夠獲得request   -->  
            org.springframework.web.context.request.RequestContextListener  
        </listener-class>  
    </listener>  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
  
  
    <!--  
        默認所對應的配置文件是WEB-INF下的{servlet-name}-servlet.xml,這裏即是:spring3-servlet.xml  
    -->  
    <servlet>  
        <servlet-name>spring3</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
  
    </servlet>  
  
    <servlet-mapping>  
        <servlet-name>spring3</servlet-name>  
        <!--  
            這裏能夠用 / 但不能用 /*  
            ,攔截了全部請求會致使靜態資源沒法訪問,因此要在spring3-servlet.xml中配置mvc:resources  
        -->  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  
  
  
  
</web-app>

    註釋已經寫了挺多,仍是稍微解釋一下要注意的地方,一個是UTF-8編碼轉換,這個最好加在最前面,讓它先生效,我在調試的時候就出過這種狀況,web.xml裏的其餘配置都正常生效了,可是編碼死活不行,一中文就亂碼,鬱悶了老半天,而後突發奇想,是否是web.xml裏先聲明的配置先生效,後聲明的後生效?接着實踐,果真不出我所料,把編碼轉換加在前面,一切正常。。。。我那個暈。。。
數據庫

    關於Spirng MVC的就不說了,那些數據訪問、業務和控制層那些的東東就自個研究去了吧。。這不是今天的重點。
express

    接着是spring-security.xml安全

    Java代碼 服務器

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:security="http://www.springframework.org/schema/security"  
    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">  
  
    <!--  Spring-Security 的配置 -->  
    <!--  
        注意use-expressions=true.表示開啓表達式,不然表達式將不可用. see:http://www.family168.com/tutorial/springsecurity3/html/el-access.html  
    -->  
    <security:http auto-config="true" use-expressions="false" access-denied-page="/user/login_failure.html">  
        <!--容許全部人訪問-->  
        <!--     <security:intercept-url pattern="/**" access="permitAll" />-->  
        <!--容許ROLE_ADMIN權限訪問-->  
        <security:intercept-url pattern="/user/findAll.html" access="ROLE_ADMIN" />  
        <!--容許ROLE_ADMIN權限訪問-->  
        <security:intercept-url pattern="/user/**" access="ROLE_ADMIN" />  
        <!--容許ROLE_USER權限訪問-->  
        <security:intercept-url pattern="/success.jsp" access="ROLE_USER,ROLE_ADMIN" />  
        <!--容許IS_AUTHENTICATED_ANONYMOUSLY匿名訪問-->  
        <security:intercept-url pattern="/anonymously.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />  
          
        <!-- filters="none"  不過濾這些資源-->  
        <security:intercept-url pattern="/js/**" filters="none" />  
        <security:intercept-url pattern="/index.jsp" filters="none" />  
  
        <!-- login-page:默認指定的登陸頁面. authentication-failure-url:出錯後跳轉頁面. default-target-url:成功登錄後跳轉頁面 -->  
        <security:form-login login-page="/index.jsp" authentication-failure-url="/user/login_failure.html"  
            default-target-url="/success.jsp" />  
        <!--  
            invalidate-session:指定在退出系統時是否要銷燬Session。logout-success-url:退出系統後轉向的URL。logout-url:指定了用於響應退出系統請求的URL。其默認值爲:/j_spring_security_logout。  
        -->  
        <security:logout invalidate-session="true" logout-success-url="/index.jsp" logout-url="/j_spring_security_logout" />  
        <!--  
            max-sessions:容許用戶賬號登陸的次數。範例限制用戶只能登陸一次。exception-if-maximum-exceeded:  
            默認爲false,此值表示:用戶第二次登陸時,前一次的登陸信息都被清空。當exception-if-maximum-exceeded="true"時系統會拒絕第二次登陸。  
        -->  
  
        <security:session-management>  
            <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1" />  
        </security:session-management>  
  
    </security:http>  
    <!-- 指定一個自定義的authentication-manager :customUserDetailsService -->  
    <security:authentication-manager>  
        <security:authentication-provider user-service-ref="customUserDetailsService">  
            <security:password-encoder ref="passwordEncoder" />  
        </security:authentication-provider>  
    </security:authentication-manager>  
  
    <!-- 對密碼進行MD5編碼 -->  
    <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />  
  
    <!--   
        經過 customUserDetailsService,Spring會控制用戶的訪問級別.  
        也能夠理解成:之後咱們和數據庫操做就是經過customUserDetailsService來進行關聯.  
     -->  
    <bean id="customUserDetailsService" class="org.yzsoft.springmvcdemo.util.CustomUserDetailsService" />  
    <!-- 自定義登錄錯誤提示,能夠取出mymessages.properties的國際化消息-->  
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
        <property name="basename" value="classpath:org/yzsoft/springmvcdemo/mymessages" />  
    </bean>  
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />  
</beans>


    這個多解釋一下,首先
session

    Java代碼 mvc

<security:intercept-url pattern="/findAll.html" access="hasRole('ROLE_ADMIN')" />  
<security:intercept-url pattern="/user/**" access="hasRole('ROLE_ADMIN')" />  
<security:intercept-url pattern="/anonymously.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />


    這個是權限控制,聲明瞭擁有什麼權限能夠訪問哪些資源,這個配置的是有ROLE_ADMIN權限的才能夠訪問/findAll.html,至於這個ROLE_ADMIN從哪來,呆會再解釋。或者像第二句同樣配置也能夠:擁有ROLE_ADMIN權限的才能夠訪問/user/下的全部資源,不然都會拋AccessDeniedException 。

IS_AUTHENTICATED_ANONYMOUSLY就是匿名訪問的意思,這個相信都懂的。。。

    而後是登錄和安全退出

    Java代碼  

<security:form-login login-page="/index.jsp" authentication-failure-url="/user/login_failure.html"default-target-url="/user/findAll.html" />  
<security:logout invalidate-session="true" logout-success-url="/index.jsp" logout-url="/user/login_failure.html" />

    解釋下上面一句,相信看也能看出來了的,login-page:默認指定的登陸頁面. authentication-failure-url:出錯後跳轉頁面(包括那些個啥用戶名密碼錯誤吖。。啥啥啥的。). default-target-url:成功登錄後跳轉頁面 (這裏我直接跳到的控制器去查數據列表)。   

    接着:invalidate-session:指定在退出系統時是否要銷燬Session。logout-success-url:退出系統後轉向的URL。logout-url:指定了用於響應退出系統請求的URL。其默認值爲:/j_spring_security_logout。

接下來是一個比較不錯的功能:是否容許同一用戶多處登錄

    Java代碼 

<security:session-management>  
     <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1" />  
</security:session-management>

    exception-if-maximum-exceeded:
       默認爲false,此值表示:用戶第二次登陸時,前一次的登陸信息都被清空。當error-if-maximum-exceeded="true"時系統會拒絕第二次登陸。 

        max-sessions:容許用戶賬號登陸的次數,這裏咱們容許一次登錄。這裏咱們作個實驗吧,看看是否是真的生效了,請看圖


 

 

    這裏咱們看到,當同一個帳號多處登錄時,就會報出Maximum sessions of 1 for this principal exceeded 的錯誤,固然,正式使用咱們換成mymessages.properties裏的咱們自定義的國際化消息,這樣人性化一點。    

相關文章
相關標籤/搜索