Spring Security 入門(一)

當你看到這篇文章時,我猜你確定是碰到使人苦惱的問題了,我但願本文能讓你有所收穫。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六、若是這篇文章幫助了你,請給我點個贊哦!方便的話關注一下噠!

相關文章
相關標籤/搜索