Spring Security中常看到Principal這個字。Principle是指一個存取系統資源的實體(Entity),簡單來說就是登入的使用者。
但Principle與User的差異是,Principal是指一個可辨識的唯一身分,用來代表一個人,一個公司,一個裝置或另一個系統,並不限定於代表一個人;而使用者(User)是指與系統互動的操作者(人)。
引述java.security.Principal
的說明:
This interface represents the abstract notion of a principal, which can be used to represent any entity, such as an individual, a corporation, and a login id.
在安全驗證的概念中,使用系統資源對象的概念可分為Subject,Principal及User,可參考這篇
而Spring Security中的principal是來自Authentication.getPrincipal()
,回傳值為被驗證或已被驗證的主體。在一個帶有使用者名稱(username)及密碼(password)的驗證請求(authentication request)中,principal即為username。
在Spring Security中principal存放在SecurityContext
的Authentication
,可透過以下取得。
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String username = ((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}
從Authentication.getPrincipal()
取得的principal為Object
型別物件,而Spring Security通常用UserDetails
來封裝principle資訊。
參考:
沒有留言:
張貼留言