2014-08-31 79 views

回答

1

spring-security 3.2 docs(也適用於version 4.0.0):

在成功切換,用戶的SecurityContext將被更新,以反映指定的用戶,也將包含其中包含原始用戶的額外SwitchUserGrantedAuthority。在切換之前,將檢查用戶是否已經被切換,並且將退出任何當前切換以防止「嵌套」切換。

所以,你必須切換用戶,當你調用後:

request.getUserPrincipal().getAuthorities() 

檢索登錄的用戶,它將包含當前USER以前ADMIN用戶的當局。前一個用戶的權限將在SwitchUserGrantedAuthority實例中。

我在我的代碼中做的是驗證當前用戶是否有一些SwitchUserGrantedAuthority在其權限中,並向該用戶添加屬性,因此客戶端知道我以管理員身份登錄,但已切換用戶。我使用了這個功能,所以我可以顯示一個按鈕,從該用戶註銷並返回到管理員頁面。

+0

優秀,我會試試看 – abiieez 2014-11-22 07:06:20

1

我解決它在以下方式:

public User getAdminLoggedAsUser() { 
    try { 
     return (User) (((SwitchUserGrantedAuthority) (SecurityContextHolder.getContext().getAuthentication().getAuthorities().toArray()[1])) 
       .getSource().getPrincipal()); 
    } catch (IndexOutOfBoundsException e) { 
     return null; 
    } 
} 

IndexOutOfBoundsException在沒有管理員登錄的用戶,bacause在這種情況下,不會有數組中SwitchUserGrantedAuthority被拋出。