當你看到這篇文章時,我猜你確定是碰到使人苦惱的問題了,我但願本文能讓你有所收穫。java
本人幾個月前仍是 Spring 小白,幾個月走來,看了 Spring,Spring boot,到此次的 Spring Security。web
爲了不你們踩坑,本人將入門的經驗傳授給那些和我同樣正在學習 Spring Security 的小白。正則表達式
咱們從官方例子學習起:spring
一、咱們先來建立一個 Spring Boot 的項目 HelloWorld:數據庫
我用的開發工具是 eclipse,若是沒裝 STS 的話,請點擊 Help -> Eclipse MarketPlace...瀏覽器
二、點擊 File -> New -> Spring Starter Project。安全
而後咱們根據須要進行選擇,如圖所示:app
三、項目建立好後的目錄如圖所示:eclipse
四、接下來咱們新建一個包,取名爲 security.config,再在包下建一個類並使其繼承 WebSecurityConfigurerAdapter。ide
五、這樣就已經能夠生成 jar 啦,咱們右鍵項目 Run as -> Maven Build... 而後 Debug,就會在 target 目錄下生成 jar 。
六、右鍵生成的 jar,點擊屬性後會看到它的文件位置,咱們在控制檯運行它:
java -jar C:\Users\Anonymous\eclipse-workspace\HelloWorld\target\HelloWorld-0.0.1-SNAPSHOT.jar
再在瀏覽器輸入 http://localhost:8080/ 就會出現一個登陸頁面。
用戶名爲 user,密碼在控制檯可找到: Using generated security password: 254f14b9-a3e4-4dd5-9888-4c46b0c27e3f
輸入進去就會出現以下圖片:
七、讓咱們從頭回顧一下,咱們幹了啥!咱們僅僅在 security 包下建立了一個 config 子包。
而後在該子包裏建立了一個類並讓它繼承 WebSecurityConfigurerAdapter 類,並在類上加了一個註解 @EnableWebSecurity。
咱們打開 HelloWorldApplication 類,能夠看到 main() 函數裏只一行代碼:
SpringApplication.run(HelloWorldApplication.class, args); 其實這一行代碼的做用總的來講是加載整個項目的意思。
在這個類上方有個 @SpringBootApplication 註解,咱們將鼠標放在上面能夠看到該註解是由一系列註解組成的。
咱們能夠把這個類比做一個樹的根,全部其餘的配置都須要以它爲基礎而展開,因此項目其餘的包應該都是它的子包。
八、咱們再看看本身建立的類 WebSecurityConfig,這個類的 @EnableWebSecurity 註解會啓用 Web 安全功能。
可是它自己並無什麼用處,Spring Security 必須配置在一個實現了 WebSecurityConfigurer 的 bean 中,
或者(簡單起見)擴展 WebSecurityConfigurerAdapter。
九、好啦,最基礎的就是這些啦,讓咱們來實現一下讓它打印 HelloWorld!
在配置類中咱們寫上以下代碼:
package security.config; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // TODO Auto-generated method stub http.authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .formLogin().defaultSuccessUrl("/hello"); } }
十、再在控制器類中寫上以下代碼:
package security.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello World"; } }
十一、好啦,大功告成,代碼已經能夠運行啦。如今咱們來了解一下它們。
在 WebSecurityConfig 類中咱們重寫了 configure(HttpSecurity http) 方法,這個方法是完成用戶受權的。
還有另一個 configure(AuthenticationManagerBuilder auth) 方法,這個方法是完成用戶認證的。
暫時咱們只瞭解第一個,第二個咱們在(二) 中瞭解。
如下內容摘自 《Spring Boot2 企業應用實戰》:HttpSecurity 的 authorizeRequests() 方法有多個子節點。
其中每一個 matcher 按照它們的聲明順序執行,指定用戶能夠訪問的多個 URL 模式。
Ⅰ、antMatchers 使用 Ant 風格匹配路徑。
Ⅱ、regexMatchers 使用正則表達式匹配路徑。
在匹配了請求路徑後,能夠針對當前用戶的信息對請求路徑進行安全處理。
方法 | 用途 |
anyRequest | 匹配全部請求路徑 |
access(String) | Spring EL 表達式結果爲 true 時能夠訪問 |
anonymous() | 匿名能夠訪問 |
denyAll() | 用戶不能訪問 |
fullyAuthenticated() | 用戶徹底認證能夠訪問(非 remember-me 下自動登陸) |
hasAnyAuthority(String...) | 若是有參數,參數表示權限,則其中任何一個權限能夠訪問 |
hasAnyRole(String...) | 若是有參數,參數表示角色,則其中任何一個角色能夠訪問 |
hasAuthority(String...) | 若是有參數,參數表示權限,則其權限能夠訪問 |
hasIpAdress(String...) | 若是有參數,參數表示 IP 地址,若是用戶 IP 和參數匹配,則能夠訪問 |
hasRole(String...) | 若是有參數,參數表示角色,則其角色能夠訪問 |
permitAll() | 用戶能夠任意訪問 |
rememberMe() | 容許經過 remember-me 登陸的用戶訪問 |
authenticated() | 用戶登陸後可訪問 |
十二、如今咱們讀一下代碼的意思:受權請求的路徑爲 "/login" 時,用戶能夠任意訪問。
其餘匹配全部請求的路徑都須要受權才能訪問。.and() 是再從 http 參數開始。
舉個例子:.and().formLogin() 至關於 http.formLogin()。
formLogin():開始設置登陸操做。defaultSuccessUrl("/hello"): 指定登陸成功後轉向的頁面。
另外還有其餘的方法,咱們在(二)再瞭解。控制類中的代碼是常見的代碼,就不說了。
1三、代碼寫完了,咱們在控制檯運行一下,再在瀏覽器輸入:http://localhost:8080/login:
登陸後,就能夠看到 Hello World!
1四、運行結果如上圖所示,市面上有些書說輸入 http://localhost:8080/ 就會自動跳轉的 login 頁面。
這的確沒錯,可是當咱們輸入用戶名密碼後,會進入到 error 頁面。這是爲何呢?
這是由於 "/" 請求須要用戶認證,而又沒有設置 "/" 請求能夠任意訪問,因此跳轉到 login 頁面進行認證。
認證成功後,控制類中並無對 "/" 請求的處理。因此這將致使出現錯誤頁面。
注意這是一個大坑,坑了本人好幾天了。
1五、最後,上面的例子僅僅是一個簡單的入門例子,咱們更經常使用的是自定義登陸頁面,而且用戶名和密碼都是從數據庫讀取來認證的。
這一部份內容將在(二)中講解。
1六、若是這篇文章幫助了你,請給我點個贊哦!方便的話關注一下噠!