Spring Security 一 核心元件

2021-10-10 22:19:44 字數 4450 閱讀 9499

securitycontextholder用於儲存安全上下文(security context)的資訊。當前操作的使用者是誰,該使用者是否已經被認證,他擁有哪些角色許可權…這些都被儲存在securitycontextholder中。

獲取使用者資訊

authentication authentication = securitycontextholder.

getcontext()

.getauthentication()

;if(!authentication.

isauthenticated()

)object principal = authentication.

getprincipal()

;string username = null;

if(principal instanceof

org.springframework.security.core.userdetails.userdetails

)else

return username;

getauthentication()返回認證資訊getprincipal()返回身份資訊。userdetails是spring對身份資訊封裝的乙個介面

/**

* authentication在spring security中是最高端別的身份/認證的抽象

*/public

inte***ce

authentication

extends

principal

, serializable

spring security是如何完成身份認證的?

使用者名稱和密碼被過濾器獲取到,封裝成authentication,通常情況下是usernamepasswordauthenticationtoken這個實現類。

authenticationmanager身份管理器負責驗證這個authentication認證成功後,authenticationmanager身份管理器返回乙個被填充滿了資訊的(包括上面提到的許可權資訊,身份資訊,細節資訊,但密碼通常會被移除)authentication例項。

securitycontextholder安全上下文容器將第3步填充了資訊的authentication,通過securitycontextholder.getcontext().setauthentication(…)方法,設定到其中。

public

inte***ce

authenticationmanager

authenticationmanager介面是認證的核心介面,也是發起認證的出發點。在實現需求中,使用者可能需要使用者名稱/密碼,手機/密碼,或者開放平台unionid登入等等,所以authenticationmanager並不直接認證。

providermanagerauthenticationmanager常用的實現類。providermanager維護著乙個list列表,存放多種認證方式,最終實際的認證工作是由authenticationprovider完成的。在預設策略下,只需要通過乙個authenticationprovider的認證,即可被認為是登入成功。也就是說,核心的認證入口始終只有乙個:authenticationmanager

providermanager**

public

class

providermanager

implements

authenticationmanager

, messagesourceaware, initializingbean

try}

catch

(internalauthenticationserviceexception

| accountstatu***ception var13)

catch

(authenticationexception var14)}}

if(result == null &&

this

.parent != null)

catch

(providernotfoundexception var11)

catch

(authenticationexception var12)

}// 如果有authentication資訊,則直接返回

if(result != null)

// //發布登入成功事件

if(parentresult == null)

return result;

//認證失敗,包裝異常資訊

}else

,"no authenticationprovider found for "))

;}if(parentexception == null)

throw lastexception;

}}

providermanager中的list,會依照次序去認證,認證成功則立即返回,若認證失敗則返回null,下乙個authenticationprovider會繼續嘗試認證,如果所有認證器都無法認證成功,則providermanager會丟擲乙個providernotfoundexception異常。

daoauthenticationprovider最常用的乙個實現類

}}daoauthenticationprovider.retrieveuser()只是檢索使用者,真正認證的邏輯在父類abstractuserdetailsauthenticationprovider

abstractuserdetailsauthenticationprovider中的認證**

userdetails介面,它代表了最詳細的使用者資訊

public

inte***ce

userdetails

extends

serializable

userdetailsservice只負責從特定的地方(通常是資料庫)載入使用者資訊,userdetailsservice常見的實現類有jdbcdaoimplinmemoryuserdetailsmanager,前者從資料庫載入使用者,後者從記憶體中載入使用者,也可以自己實現userdetailsservice,通常這更加靈活。

public

inte***ce

userdetailsservice

認證流程常是資料庫)載入使用者資訊,userdetailsservice常見的實現類有jdbcdaoimplinmemoryuserdetailsmanager,前者從資料庫載入使用者,後者從記憶體中載入使用者,也可以自己實現userdetailsservice,通常這更加靈活。

public

inte***ce

userdetailsservice

認證流程

Spring Security學習總結一

security.xml 各種過濾器實戰,常用九個如下 一 鏈之 remembermeprocessingfilter 1。使用 選上remember me後,一旦頁面關閉或者伺服器重啟,還可以記得使用者的登陸狀態。remember me 2.設定 security.xml 登陸,登出中 二 鏈之 ...

SpringSecurity(一)初體驗

一 只需要新增兩個依賴 org.springframework.boot groupid spring boot starter security artifactid dependency org.springframework.boot groupid spring boot starter w...

Spring Security 核心類詳解一

securitycontextholder 是用來儲存 securitycontext 的。securitycontext 中含有當前正在訪問系統的使用者的詳細資訊。預設情況下,securitycontextholder 將使用 threadlocal 來儲存 securitycontext,這也就...