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的使用方法就講到這里了,感謝大家的閱讀!下期再見!