1. 程式人生 > >Spring Security使用Authentication獲取當前使用者資訊

Spring Security使用Authentication獲取當前使用者資訊

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並進行返回。