spring security中當前用戶信息
1:如果在jsp頁面中獲取可以使用spring security的標簽庫
在頁面中引入標簽
1
|
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
|
然后:
1
|
<div> username : <sec:authentication property="name"/></div>
|
即可顯示當前用戶。
2:如果要在程序中獲得
看了網上很多寫法都是在程序中寫這樣的代碼
1
|
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication() .getPrincipal();
|
但我在實際運用中發現獲得的Authentication為null。仔細看了下源代碼發現,如果想用上面的代碼獲得當前用戶,必須在spring
security過濾器執行中執行,否則在過濾鏈執行完時org.springframework.security.web.context.SecurityContextPersistenceFilter類會
調用SecurityContextHolder.clearContext();而把SecurityContextHolder清空,所以會得到null。 經過spring security認證后,
security會把一個SecurityContextImpl對象存儲到session中,此對象中有當前用戶的各種資料
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
SecurityContextImpl securityContextImpl = (SecurityContextImpl) request
.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
// 登錄名
System.out.println("Username:"
+ securityContextImpl.getAuthentication().getName());
// 登錄密碼,未加密的
System.out.println("Credentials:"
+ securityContextImpl.getAuthentication().getCredentials());
WebAuthenticationDetails details = (WebAuthenticationDetails) securityContextImpl
.getAuthentication().getDetails();
// 獲得訪問地址
System.out.println("RemoteAddress" + details.getRemoteAddress());
// 獲得sessionid
System.out.println("SessionId" + details.getSessionId());
// 獲得當前用戶所擁有的權限
List<GrantedAuthority> authorities = (List<GrantedAuthority>) securityContextImpl
.getAuthentication().getAuthorities();
for (GrantedAuthority grantedAuthority : authorities) {
System.out.println("Authority" + grantedAuthority.getAuthority());
}
|