前面通過入門案例介紹,我們發(fā)現(xiàn)在SpringSecurity中如果我們沒有使用自定義的登錄界面,那么SpringSecurity會(huì)給我們提供一個(gè)系統(tǒng)登錄界面。但真實(shí)項(xiàng)目中我們一般都會(huì)使用自定義的登錄界面,本文我們就來介紹下如何實(shí)現(xiàn)該操作。
注意:本文是在入門案例代碼的基礎(chǔ)上演示的!
一、頁面準(zhǔn)備
我們準(zhǔn)備如下相關(guān)的jsp頁面
1.login.jsp頁面
<%--
Created by IntelliJ IDEA.
User: dengp
Date: 2019/12/1
Time: 20:40
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="JAVA" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登錄管理</h1>
<form>
賬號(hào):<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="登錄"><br>
</form>
<img src="img/a1.jpg">
</body>
</html>
2.home.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>home界面</h1>
</body>
</html>
3.其他頁面
在這里插入圖片描述
二、SpringSecurity相關(guān)配置
1.配置認(rèn)證信息
配置登錄和注銷相關(guān)的信息
<security:http auto-config="true" use-expressions="true">
<!--
攔截資源
pattern="/**" 攔截所有的資源
access="hasanyrole('role1')" 表示只有role1這個(gè)角色可以訪問資源
-->
<security:intercept-url pattern="/**" access="hasanyrole('role_user')"></security:intercept-url>
<!--
配置認(rèn)證信息
login-page="/login.jsp" 自定義的登錄頁面
login-processing-url="/login" security中處理登錄的請(qǐng)求
default-target-url="/home.jsp" 默認(rèn)的跳轉(zhuǎn)地址
authentication-failure-url="/failure.jsp" 登錄失敗的跳轉(zhuǎn)地址
-->
<security:form-login login-page="/login.jsp"
login-processing-url="/login"
default-target-url="/home.jsp"
authentication-failure-url="/failure.jsp"
/>
<!-- 配置退出的登錄信息 -->
<security:logout logout-url="/logout"
logout-success-url="/login.jsp"
/>
</security:http>
2.認(rèn)證界面匿名訪問
前面配置的
<security:intercept-url pattern="/**" access="hasanyrole('role_user')"></security:intercept-url>
會(huì)使登錄界面不可訪問,所以我們需要方法
在這里插入圖片描述
3.放過靜態(tài)資源
同樣的系統(tǒng)的 js css 等靜態(tài)資源文件也會(huì)被對(duì)應(yīng)的過濾器攔截,所以也需要方法
在這里插入圖片描述
4.登錄測(cè)試
啟動(dòng)服務(wù)我們?cè)L問登錄試試
在這里插入圖片描述
可以訪問到,然后提交登錄看看
注意表單設(shè)置
在這里插入圖片描述
然后訪問出現(xiàn)了403錯(cuò)誤
在這里插入圖片描述
三、關(guān)閉csrf攔截
上面我們?cè)谫~號(hào)和角色都正確的情況下,登錄后出現(xiàn)了 403錯(cuò)誤,原因是因?yàn)?csrf過濾器攔截了,那為什么系統(tǒng)提供的登錄界面沒問題呢?原因是如下
在這里插入圖片描述
在系統(tǒng)提供的登錄表單中隱藏的有csrf相關(guān)的信息。這時(shí)我們可以關(guān)閉csrf過濾器,來實(shí)現(xiàn)登錄工作
在這里插入圖片描述
重啟服務(wù)再測(cè)試就可以了
在這里插入圖片描述
四、csrf防護(hù)
上面我們通過關(guān)閉csrf過濾器實(shí)現(xiàn)了認(rèn)證功能,但是系統(tǒng)將面臨csrf攻擊的風(fēng)險(xiǎn),所以我們需要放開服務(wù),同時(shí)也要能夠完成認(rèn)證。首先我們來看下CsrfFilter的源碼
1.CsrfFilter源碼查看
在這里插入圖片描述
this.requireCsrfProtectionMatcher.matches(request)方法
在這里插入圖片描述
通過 GET HEAD TRACE OPTIONS 提交的數(shù)據(jù)不會(huì) csrf 驗(yàn)證
2.放開過濾器
前面關(guān)閉的我們需要放開
在這里插入圖片描述
3.頁面動(dòng)態(tài)token
導(dǎo)入security標(biāo)簽
在這里插入圖片描述
在表單中使用,作用和下面的一致
在這里插入圖片描述
:ajax方式提交的時(shí)候使用
五、注銷功能
在home.jsp中添加注銷鏈接
在這里插入圖片描述
點(diǎn)擊后出現(xiàn)了404錯(cuò)誤原因是:自定義的注銷功能必須通過post方式提交才行,所以如下
在這里插入圖片描述
在這里插入圖片描述
出現(xiàn)這個(gè)原因是 csrf的原因,加標(biāo)簽即可
在這里插入圖片描述
搞定~