spring-security和servlet的filter

如果要對(duì)Web資源進(jìn)行保護(hù),最好的辦法莫過于Filter
如果要想對(duì)方法調(diào)用進(jìn)行保護(hù),最好的辦法莫過于AOP

servlet的filter

Spring Security 作為一個(gè)單獨(dú)的過濾器安裝在鏈中,其配置類型為 FilterChainProxy。


增加spring security框架

Spring Security 可以根據(jù)訪問地址進(jìn)行細(xì)化:


圖2 細(xì)化過濾器

安全過濾器鏈(或等同于WebSecurityConfigurerAdapter)具有請(qǐng)求匹配器,用于決定是否將其應(yīng)用于HTTP請(qǐng)求。 一旦決定采用特定的過濾器鏈,則不會(huì)應(yīng)用其他過濾器。


這里可以跟spring security的核心類進(jìn)行對(duì)應(yīng)一下:
【備注】有些書也會(huì)把AuthenticationManager等同于非父類的那些ProviderManager,就是除了頂上那個(gè)這張圖里的其他ProviderManager

圖3 核心類

  • 每個(gè)人都是一個(gè) ProviderManager,他們共享一個(gè)父類。
  • 有時(shí)應(yīng)用程序具有受保護(hù)資源的邏輯組(例如所有與路徑模式/ api / **相匹配的Web資源),并且每個(gè)組可以具有其自己的專用 AuthenticationManager;
  • 父類是一種“全局”資源,充當(dāng)所有提供者的失敗回調(diào)。如果所有的提供者返回null,則將再交給父類去認(rèn)證。 如果父類不可用,則會(huì)導(dǎo)致 AuthenticationException。

參考:http://www.blogjava.net/youxia/archive/2008/12/07/244883.html
課程:https://www.iteye.com/blogs/subjects/spring_security
w3school:https://www.w3cschool.cn/springsecurity/cdz11ihv.html

慕課網(wǎng)的視頻教程(springboot下的spring security配置):http://www.itdecent.cn/p/24c6a65c3913

比較接近SSM下的spring security配置:https://wenku.baidu.com/view/e05cef2d00f69e3143323968011ca300a6c3f6e6.html

spring-security的核心能力:

  • 認(rèn)證(你是誰)
  • 授權(quán)(你能干什么)
  • 攻擊防護(hù)(防止偽造身份)

原理:在web.xml中配置的一個(gè)代理,web.xml中的代理依次調(diào)用下面的Bean,就實(shí)現(xiàn)了對(duì)Web資源的保護(hù)。同時(shí)這些Filter作為Bean被Spring管理。

 <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-security要在tomcat啟動(dòng)的時(shí)候被加載

<context-param>
      <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/config/applicationContext.xml,/WEB-INF/config/spring-security.xml</param-value> <!--把spring security的xml加進(jìn)去-->
   </context-param>

   <listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>

spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/security"
            xmlns:bean="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.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-4.1.xsd">

    <!--
    1、設(shè)置放行資源,如登錄注冊(cè)頁面,靜態(tài)資源css、js等等
        security="none" 設(shè)置此資源不被攔截.
    -->
    <http pattern="/login.jsp" security="none"></http>
    <http pattern="/loginerror.html" security="none"></http>
    <http pattern="/css/**" security="none"></http>
    <http pattern="/img/**" security="none"></http>
    <http pattern="/js/**" security="none"></http>
    <http pattern="/plugins/**" security="none"></http>

    <http>
        <!-- 2、攔截所有(除放行資源外) -->
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <!--
            3、登錄表單設(shè)置

            1)login-page:指定登錄頁面;
            2)login-processing-url:指定登錄請(qǐng)求路徑;

            3)default-target-url:指定了成功進(jìn)行身份驗(yàn)證和授權(quán)后默認(rèn)呈現(xiàn)給用戶的頁面;
            4)always-use-default-target:指定了是否在身份驗(yàn)證通過后總是跳轉(zhuǎn)到;
                                       default-target-url 屬性指定的 URL。

            5)authentication-failure-url:指定了身份驗(yàn)證失敗時(shí)跳轉(zhuǎn)到的頁面;

         -->

        <form-login login-page="/login.jsp"
                    login-processing-url="/login"
                    always-use-default-target="true"
                    default-target-url="/index.jsp"
                    authentication-failure-url="/loginerror.html"

        />
        <!--   4、注銷設(shè)置
                  1)logout-url:指定注銷的url;
                  2)logout-success-url:注銷成功后登錄返回的頁面。
        -->
        <logout logout-url="/logout" logout-success-url="/login.html"/>
        <!--
            5、跨站請(qǐng)求設(shè)置(我們這里關(guān)閉)
               1)csrf disabled="true" 關(guān)閉 csrf ,如果不加會(huì)出現(xiàn)錯(cuò)誤

               2)CSRF(Cross-site request forgery):跨站請(qǐng)求偽造,
                 也被稱為“One Click Attack”或者 SessionRiding,
                 通??s寫為 CSRF 或者 XSRF,是一種對(duì)網(wǎng)站的惡意利用。
         -->
        <csrf disabled="true" />

        <!-- 6、iframe 框架結(jié)構(gòu)展示 -->
        <headers>
            <frame-options policy="SAMEORIGIN" />
        </headers>
    </http>
    <!--
            認(rèn)證管理器
            1)我們這里設(shè)置一個(gè)默認(rèn)用戶
     -->
    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user authorities="ROLE_USER" name="admin" password="123456" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
</bean:beans>

這個(gè)文件說明了兩件事情:

  • 對(duì)所有http的請(qǐng)求(pattern="/**")進(jìn)行攔截;
  • 加入一個(gè)authentication-manager, 里面提供一種認(rèn)證方式,就是對(duì)賬號(hào)密碼進(jìn)行驗(yàn)證;

注意,需要自己增加一個(gè)login.jsp的登陸頁和登陸成功后默認(rèn)會(huì)跳轉(zhuǎn)的index.jsp頁面
【參考】https://blog.csdn.net/houysx/article/details/80380831
這個(gè)XML如何解釋的代碼:https://www.cnblogs.com/xhj123/p/6193864.html

過濾器鏈的順序是非常重要的,接下來看看過濾鏈的順序。

常用的filter:

  1. 制定必須為https連接;
  2. 從Session中提取用戶的認(rèn)證信息;
  3. 退出登錄;
  4. 登錄;
  5. 記住用戶;
  6. 所有的應(yīng)用必須配置這個(gè)Filter。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容