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
並不直接認證。
providermanager
是authenticationmanager
常用的實現類。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
常見的實現類有jdbcdaoimpl
,inmemoryuserdetailsmanager
,前者從資料庫載入使用者,後者從記憶體中載入使用者,也可以自己實現userdetailsservice
,通常這更加靈活。
public
inte***ce
userdetailsservice
認證流程常是資料庫)載入使用者資訊,userdetailsservice
常見的實現類有jdbcdaoimpl
,inmemoryuserdetailsmanager
,前者從資料庫載入使用者,後者從記憶體中載入使用者,也可以自己實現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,這也就...