spring security 5 使用及分析(一:簡單的使用)


Java Web項目的權限管理框架,目前有兩個比較成熟且使用較多的框架,Shiro 和 Spring Security ,Shiro 比 Spring Security更加輕量級,但是需要手動配置的東西較多,Spring Security 和 Spring 集成更好,甚至直接適配了Spring Boot。

一、最簡單的使用:
1.1、配置及使用

要使用Spring Security 首先要引入依賴,Spring-boot 已經有了集成,直接引入spring-boot-statr-security依賴包即可:

<!-- spring security -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

此時就有了一個基本的Spring Security,隨后我們打開瀏覽器,訪問http://localhost:8080,就會出來了一個登錄頁面,但是resouces文件夾下除了兩個配置文件,別的什么都沒有,也沒有創建任何的html文件,為什么就會出現一個登錄頁面呢?

這里Spring Security默認已經為我們做了一些配置,並且創建一個簡單的登錄頁面,那這個頁面是怎么來的?通過查看相關文檔和源碼來一探究竟。

1.2 、分析原理

1.2.1、登錄頁面:

一般不知從何入手,就看官方文檔里是如何做的,官方的文檔和api 是最好最完整的介紹和參考,點擊鏈接查看官方文檔地址(https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#jc-oauth2login),或者通過Google 搜索 spring security,在結果中點擊Spring Security Reference,點擊進入頁面,然后就可以看到關於Spring Security的文檔;

通過查看文檔發現,WebSecurityConfigurerAdapter 提供的默認的配置,那就來看看這個抽象類,在這個抽象類中,又一個方法配置了formLogin(),這個方法內容如下:

 

 

查看formLogin()源碼,跳轉到HttpSecurity類中,這個方法返回一個FormLoginConfigurer<HttpSercurity>類型的數據。再繼續看看這個FormLoginConfigurer,在FormLoginConfigurer中有個initDefaultLoginFilter()方法:

 

 

 

這個方法,初始化一個默認登錄頁的過濾器,可以看到第一句代碼,默認的過濾器是DefaultLoginPageGeneratingFilter,下面是設置一些必要的參數,進入到這個過濾器中:

在描述中可以看到,如果沒有配置login頁,這個過濾器會被創建,然后看doFilter()方法:

 

 

 登錄頁面的配置是通過generateLoginPageHtml()方法創建的,再看看這個方法內容:

 

 

 我們可以看到默認的頁面配置情況(由於代碼較多,僅截圖示意一下)

1.2.2、登錄用戶及密碼:

在項目啟動的日志中,可以發現有這樣一條信息:

 

 

可以看到,自動配置類是UserDetailsServiceAutoConfiguration,密碼是60e32f52-2e83-4c0e-9ae1-1fd90c5ac588,現在知道了密碼,那用戶名是什么還不知道,進入到UserDetailsServiceAutoConfiguration中去看看。

在這個 UserDetailsServiceAutoConfiguration 類的描述中可以知道,這個類是設置一些 Spring Security 相關默認的自動配置,把InMemoryUserDetailsManager 中得user 和 password 信息設置為默認得用戶和密碼,可以通過提供的AuthenticationManager、AuthenticationProvider 或者 UserDetailsService 的 bean 來覆蓋默認的自動配置信息。

 

 可以看到,日志中那句密碼打印的是從圖片中圈出來的這條語句打印的,在這個方法上面有一個inMemoryUserDetailsManager()方法,返回一個新的帶有UserDetials信息參數構造的InMemoryUSerDetailsManager對象:

 

 

可以看到,第一個參數是User.withUsername(user.getName()),這個user.getName()的user 對象是上面SecurityProperties.User類型的,通過SecurityProperties 對象中獲取的,首先看下SecurityProperties類:

 

 通過配置文件中的,前綴為spring.security 的配置可以改變默認配置信息,再看看SecurityProperties 的 getUser()方法:

 

 

 

 通過一步步的跟蹤,發現默認的用戶名是user。現在需要定義一個成功之后返回信息的Controller,並寫一個方法:

 

 去默認的登錄頁面嘗試一下,輸入用戶名:user ,密碼:(每次啟動都會重新生成一個UUID的字符串),登錄成功了,跳轉到了index.html

 

 

那么簡單的SpringSecurity的使用方法就講到這里了,感謝大家的閱讀!下期再見!


免責聲明!

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



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