16.1. Servlet 2.5+ 整合

16.1. Servlet 2.5+ 整合

16.1.1. HttpServletRequest.getRemoteUser()

HttpServletRequest.getRemoteUser() 方法會回傳 SecurityContextHolder.getContext().getAuthentication().getName() 的結果,一般來說就是目前使用者的 username。

這功能在你想要在應用程式中展示目前使用者的 username 時很有用,另外檢查這個值是否為 null 也可以被用來辨識一個使用者是否有經過驗證或是一個匿名使用者。當要決定某個 UI 元件 (例如應該只有已驗證使用者可以看得到登出連結) 是否要顯示時,知道使用者是否經過驗證就很有用了。

16.1.2. HttpServletRequest.getUserPrincipal()

HttpServletRequest.getUserPrincipal() 方法則會回傳 SecurityContextHolder.getContext().getAuthentication() 的結果。這表示這個物件是一個 Authentication,而當使用 username 和 password 為基礎的驗證方式時,它通常是 UsernamePasswordAuthenticationToken 的一個實例。

當你需要知道更多關於使用者資訊時,這就很有用了。舉例來說,你可能需要自訂一個可以回傳包含使用者姓跟名的客製 UserDetailsUserDetailsService,你可以這樣來取得資訊:

Authentication auth = httpServletRequest.getUserPrincipal();
// 假設已整合的自訂 UserDetails 叫做 MyCustomUserDetails
// 預設它通常是一個 UserDetails 的實例
MyCustomUserDetails userDetails = (MyCustomUserDetails) auth.getPrincipal();
String firstName = userDetails.getFirstName();
String lastName = userDetails.getLastName();

值得注意的是在整個應用程式中作這麼多邏輯操作通常是個壞習慣,我們應該將將它集中以盡量降低 Spring Security 跟 Servlet API 的耦合

16.1.3. HttpServletRequest.isUserInRole(String)

HttpServletRequest.isUserInRole(String) 方法會判斷 SecurityContextHolder.getContext().getAuthentication().getAuthorities() 是否包含了被傳入 isUserInRole(String) 腳色的 GrantedAuthority

通常使用者不應該將 ROLE_ 這個前綴字一併傳入這個方法,因為它會被自動加上去。例如如果你想判斷目前使用者是否有 ROLE_ADMIN 的權限,你可以這樣做:

boolean isAdmin = httpServletRequest.isUserInRole("ADMIN");

這個功能在當你要決定某個 UI 元件是否要被顯示時可能會有用,譬如只有管理員使用者可以看到管理員連結。