如果要對(duì)Web資源進(jìn)行保護(hù),最好的辦法莫過于Filter
如果要想對(duì)方法調(diào)用進(jìn)行保護(hù),最好的辦法莫過于AOP
Spring Security 作為一個(gè)單獨(dú)的過濾器安裝在鏈中,其配置類型為 FilterChainProxy。
Spring Security 可以根據(jù)訪問地址進(jìn)行細(xì)化:
安全過濾器鏈(或等同于WebSecurityConfigurerAdapter)具有請(qǐng)求匹配器,用于決定是否將其應(yīng)用于HTTP請(qǐng)求。 一旦決定采用特定的過濾器鏈,則不會(huì)應(yīng)用其他過濾器。
這里可以跟spring security的核心類進(jìn)行對(duì)應(yīng)一下:
【備注】有些書也會(huì)把AuthenticationManager等同于非父類的那些ProviderManager,就是除了頂上那個(gè)這張圖里的其他ProviderManager
- 每個(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:
- 制定必須為https連接;
- 從Session中提取用戶的認(rèn)證信息;
- 退出登錄;
- 登錄;
- 記住用戶;
- 所有的應(yīng)用必須配置這個(gè)Filter。