前面通過入門案例介紹,我們發現在SpringSecurity中如果我們沒有使用自定義的登錄界面,那么SpringSecurity會給我們提供一個系統登錄界面。但真實項目中我們一般都會使用自定義的登錄界面,本文我們就來介紹下如何實現該操作。
注意:本文是在入門案例代碼的基礎上演示的!
一、頁面準備
我們準備如下相關的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>
賬號:<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相關配置
1.配置認證信息
配置登錄和注銷相關的信息
<security:http auto-config="true" use-expressions="true">
<!--
攔截資源
pattern="/**" 攔截所有的資源
access="hasanyrole('role1')" 表示只有role1這個角色可以訪問資源
-->
<security:intercept-url pattern="/**" access="hasanyrole('role_user')"></security:intercept-url>
<!--
配置認證信息
login-page="/login.jsp" 自定義的登錄頁面
login-processing-url="/login" security中處理登錄的請求
default-target-url="/home.jsp" 默認的跳轉地址
authentication-failure-url="/failure.jsp" 登錄失敗的跳轉地址
-->
<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.認證界面匿名訪問
前面配置的
<security:intercept-url pattern="/**" access="hasanyrole('role_user')"></security:intercept-url>
會使登錄界面不可訪問,所以我們需要方法
在這里插入圖片描述
3.放過靜態資源
同樣的系統的 js css 等靜態資源文件也會被對應的過濾器攔截,所以也需要方法
在這里插入圖片描述
4.登錄測試
啟動服務我們訪問登錄試試
在這里插入圖片描述
可以訪問到,然后提交登錄看看
注意表單設置
在這里插入圖片描述
然后訪問出現了403錯誤
在這里插入圖片描述
三、關閉csrf攔截
上面我們在賬號和角色都正確的情況下,登錄后出現了 403錯誤,原因是因為 csrf過濾器攔截了,那為什么系統提供的登錄界面沒問題呢?原因是如下
在這里插入圖片描述
在系統提供的登錄表單中隱藏的有csrf相關的信息。這時我們可以關閉csrf過濾器,來實現登錄工作
在這里插入圖片描述
重啟服務再測試就可以了
在這里插入圖片描述
四、csrf防護
上面我們通過關閉csrf過濾器實現了認證功能,但是系統將面臨csrf攻擊的風險,所以我們需要放開服務,同時也要能夠完成認證。首先我們來看下CsrfFilter的源碼
1.CsrfFilter源碼查看
在這里插入圖片描述
this.requireCsrfProtectionMatcher.matches(request)方法
在這里插入圖片描述
通過 GET HEAD TRACE OPTIONS 提交的數據不會 csrf 驗證
2.放開過濾器
前面關閉的我們需要放開
在這里插入圖片描述
3.頁面動態token
導入security標簽
在這里插入圖片描述
在表單中使用,作用和下面的一致
在這里插入圖片描述
:ajax方式提交的時候使用
五、注銷功能
在home.jsp中添加注銷鏈接
在這里插入圖片描述
點擊后出現了404錯誤原因是:自定義的注銷功能必須通過post方式提交才行,所以如下
在這里插入圖片描述
在這里插入圖片描述
出現這個原因是 csrf的原因,加標簽即可
在這里插入圖片描述
搞定~






