Spring Security使用Authentication獲取當前使用者資訊
阿新 • • 發佈:2019-02-04
Spring Security使用一個Authentication物件來描述當前使用者的相關資訊。SecurityContextHolder中持有的是當前使用者的SecurityContext,而SecurityContext持有的是代表當前使用者相關資訊的Authentication的引用。這個Authentication物件不需要我們自己去建立,在與系統互動的過程中,Spring Security會自動為我們建立相應的Authentication物件,然後賦值給當前的SecurityContext。但是往往我們需要在程式中獲取當前使用者的相關資訊,比如最常見的是獲取當前登入使用者的使用者名稱。在程式的任何地方,通過如下方式我們可以獲取到當前使用者的使用者名稱。
public String getCurrentUsername() {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
return ((UserDetails) principal).getUsername();
}
if (principal instanceof Principal) {
return ((Principal) principal).getName();
}
return String.valueOf(principal);
}
通過Authentication.getPrincipal()可以獲取到代表當前使用者的資訊,這個物件通常是UserDetails的例項。獲取當前使用者的使用者名稱是一種比較常見的需求,關於上述程式碼其實Spring Security在Authentication中的實現類中已經為我們做了相關實現,所以獲取當前使用者的使用者名稱最簡單的方式應當如下。
public String getCurrentUsername () {
return SecurityContextHolder.getContext().getAuthentication().getName();
}
此外,呼叫SecurityContextHolder.getContext()獲取SecurityContext時,如果對應的SecurityContext不存在,則Spring Security將為我們建立一個空的SecurityContext並進行返回。