1. 程式人生 > 其它 >spring security幾大核心元件

spring security幾大核心元件

一、SecurityContext

安全上下文,使用者通過Spring Security 的校驗之後,驗證資訊儲存在SecurityContext中

SecurityContext介面只定義了兩個方法,實際上其主要作用就是獲取Authentication物件

二、SecurityContextHolder

SecurityContextHolder看名知義,是一個holder,用來hold住SecurityContext例項的。在典型的web應用程式中,使用者登入一次,然後由其會話ID標識。伺服器快取持續時間會話的主體資訊。在Spring Security中,在請求之間儲存SecurityContext的責任落在SecurityContextPersistenceFilter上,預設情況下,該上下文將上下文儲存為HTTP請求之間的HttpSession屬性。它會為每個請求恢復上下文SecurityContextHolder,並且最重要的是,在請求完成時清除SecurityContextHolder。SecurityContextHolder是一個類,他的功能方法都是靜態的(static)。

SecurityContextHolder可以設定指定JVM策略(SecurityContext的儲存策略),這個策略有三種:

MODE_THREADLOCAL:SecurityContext 儲存線上程中。

MODE_INHERITABLETHREADLOCAL:SecurityContext 儲存線上程中,但子執行緒可以獲取到父執行緒中的 SecurityContext。

MODE_GLOBAL:SecurityContext 在所有執行緒中都相同。

SecurityContextHolder預設使用MODE_THREADLOCAL模式,即儲存在當前執行緒中。

三、Authentication

authentication 直譯過來是“認證”的意思,在Spring Security 中Authentication用來表示當前使用者是誰,一般來講你可以理解為authentication就是一組使用者名稱密碼資訊。Authentication也是一個介面。

介面有4個get方法,分別獲取

Authorities, 填充的是使用者角色資訊。

Credentials,直譯,證書。填充的是密碼。

Details ,使用者資訊。

Principal 直譯,形容詞是“主要的,最重要的”,名詞是“負責人,資本,本金”。感覺很彆扭,所以,還是不翻譯了,直接用原詞principal來表示這個概念,其填充的是使用者名稱。

因此可以推斷其實現類有這4個屬性。這幾個方法作用如下:

getAuthorities: 獲取使用者許可權,一般情況下獲取到的是使用者的角色資訊。

getCredentials: 獲取證明使用者認證的資訊,通常情況下獲取到的是密碼等資訊。

getDetails: 獲取使用者的額外資訊,(這部分資訊可以是我們的使用者表中的資訊)

getPrincipal: 獲取使用者身份資訊,在未認證的情況下獲取到的是使用者名稱,在已認證的情況下獲取到的是 UserDetails (UserDetails也是一個介面,裡邊的方法有getUsername,getPassword等)。

isAuthenticated: 獲取當前 Authentication 是否已認證。

setAuthenticated: 設定當前 Authentication 是否已認證(true or false)。

四、UserDetails

UserDetails,看命知義,是使用者資訊的意思。其儲存的就是使用者資訊

其介面方法含義如下:

getAuthorites:獲取使用者許可權,本質上是使用者的角色資訊。

getPassword: 獲取密碼。

getUserName: 獲取使用者名稱。

isAccountNonExpired: 賬戶是否過期。

isAccountNonLocked: 賬戶是否被鎖定。

isCredentialsNonExpired: 密碼是否過期。

isEnabled: 賬戶是否可用。

五、UserDetailsService

提到了UserDetails就必須得提到UserDetailsService, UserDetailsService也是一個介面,且只有一個方法loadUserByUsername,他可以用來獲取UserDetails。

通常在spring security應用中,我們會自定義一個CustomUserDetailsService來實現UserDetailsService介面,並實現其public UserDetails loadUserByUsername(final String login);方法。我們在實現loadUserByUsername方法的時候,就可以通過查詢資料庫(或者是快取、或者是其他的儲存形式)來獲取使用者資訊,然後組裝成一個UserDetails,(通常是一個org.springframework.security.core.userdetails.User,它繼承自UserDetails) 並返回。

在實現loadUserByUsername方法的時候,如果我們通過查庫沒有查到相關記錄,需要丟擲一個異常來告訴spring security來“善後”。這個異常是org.springframework.security.core.userdetails.UsernameNotFoundException。

六、AuthenticationManager

AuthenticationManager 的作用就是校驗Authentication,如果驗證失敗會丟擲AuthenticationException異常。AuthenticationException是一個抽象類,因此程式碼邏輯並不能例項化一個AuthenticationException異常並丟擲,實際上丟擲的異常通常是其實現類,如DisabledException,LockedException,BadCredentialsException等。BadCredentialsException可能會比較常見,即密碼錯誤的時候。