SpringBootSecurity學習(03)網頁版登錄添加自定義登錄頁面


自定義登錄頁面

前面無論是使用默認配置,還是自定義配置類,都是使用的springboot-security自帶的登錄頁面,自帶的登錄頁面在這個版本雖然設計的非常不錯,但是在實際開發中,我們通常還是使用自己的登錄頁面。下面來寫一個非常簡單的登錄頁面:

file

這個頁面只有填寫用戶名和密碼的地方,然后就是一個form表單提交,沒有任何其他內容。特別注意!!這里頁面雖然引入了thymeleaf模板,但是沒有使用thymeleaf的任何標簽屬性,使用的是原生的html標簽。繼續下面,然后是定義登錄頁面的路徑:

file

這樣登錄頁面就添加完成了。

修改配置類

在配置類中添加自定義登錄頁面很簡單,定義登錄頁面鏈接即可:

file

配置完成后,啟動項目,訪問登錄頁面,可以看到這樣一個錯誤:

file

顯示重定向次數過多。原來前面我們授權配置的時候,所有自定義的路徑在未登錄的情況下,都會重定向到登錄頁面,現在登錄路徑也是自定義的,所以它一直在自我重定向。登錄路徑本身要配置成不需要授權就能訪問的路徑才合理。配置方式很簡單,只需要加上一個 permitAll 方法即可:

file

現在重啟項目,訪問登錄可以正常訪問,輸入賬號也可以正常訪問了!

csrf配置

上面的頁面和配置類修改好了以后,輸入賬號登錄,卻發現登錄一直不成功,總是會跳轉到登錄頁面。這是什么原因呢?上面的提到了頁面使用的是原生的html標簽,沒有使用thymeleaf模板的屬性。先說這種原生的情況,之所以登錄不成功,原因是Spring Security默認是開啟CSRF的,所以需要請求中包含CSRF的token信息,在其官方文檔中,提供了在form中嵌入一個hidden標簽來獲取token信息,其原理是,hidden標簽使用了Spring Security提供的標簽,即${_csrf.parameterName}、${_csrf.token}, 后台頁面渲染過程中,將此標簽解所對應的值解析出來,這樣,我們的form表單,就嵌入了Spring Security的所需的token信息,在后續的提交登錄請求時,就不會出現沒有CSRF token的異常。做法如下:

file

這時候登錄,就發現可以成功。在springboot2.1.x版本下,還有第二種更好的解決方案,就是使用thymeleaf模板的form標簽屬性:

file

在form標簽中,使用th:action屬性,這樣會在表單中默認添加一個hidden的input標簽,效果和第一種解決方式類似,查看源碼,就可以看到:

file

另外,還有一個解決辦法是,通過關閉CSRF來解決,這個幾乎在任何場景中都能解決這個問題(上面這個解決方案,可能在某些渲染模板不能解析出來token值,不過可以通過后台程序來獲取token值,然后自己定義變量來渲染到form中,這個也是可以的)。具體的做法是通過修改配置文件來關閉,我這里使用的是SpringBoot開發的項目,配置文件直接寫在配置類中,通過.csrf().disable()來關閉。不過這種方案,會迎來CSRF攻擊,不建議在生產環境中使用,如果系統對外界做了隔離,這樣做也是可以的。大部分的生產環境采用的也多是這種方案。

file

上面三種解決方案都可以解決登錄不成功的問題。

配置登錄成功后的默認頁面

現在security登錄成功后默認會跳轉到一個路徑,這個路徑就是登錄鏈接去掉后面的/login,這個默認跳轉也是可以配置的:

file

然后再把默認頁面改為/home路徑:

file

現在我們登錄成功,跳轉的就是/home:

file

配置登出

除了登錄,security還有自帶的登出,即退出系統功能,默認路徑就是/logout。我們可以在home頁面中加一個登出操作:

file

退出后,默認進入的自然是登錄頁面,但是瀏覽器路徑上面,要顯示出剛才是退出系統了。所以應該顯示的路徑是/login?logout,但是由於這個路徑沒有授權,會再次跳轉到登錄頁面,顯示的也就還是/login,所以我們對登出也要進行授權:

file

現在顯示的就是正常的退出后的路徑:

file

代碼地址 : https://gitee.com/blueses/spring-boot-security 03


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM