我尝试将用户从ADMIN
切换为USER
。但是在切换后我注意到我丢失了ADMIN
的主要信息。
如何通过ADMIN
检查此用户是否已切换?
答案 0 :(得分:1)
来自spring-security 3.2 docs(也适用于version 4.0.0):
在成功切换时,将更新用户的SecurityContext以反映指定的用户,并且还将包含包含原始用户的其他SwitchUserGrantedAuthority。在切换之前,将检查用户当前是否已经切换,并且将退出任何当前切换以防止"嵌套"开关。
因此,在您切换用户后,当您致电:
request.getUserPrincipal().getAuthorities()
用于检索已记录的用户,它将包含前一个USER
用户的当前ADMIN
和的权限。上一个用户的权限将位于SwitchUserGrantedAuthority
实例中。
我在我的代码中做的是验证当前用户是否在其权限中有一些SwitchUserGrantedAuthority
并向该用户添加属性,以便客户端我知道我以管理员身份登录,但已切换用户。我使用了这个,所以我可以显示一个按钮,用于从该用户注销并返回管理员页面。
答案 1 :(得分:1)
我按照以下方式解决了这个问题:
public User getAdminLoggedAsUser() {
try {
return (User) (((SwitchUserGrantedAuthority) (SecurityContextHolder.getContext().getAuthentication().getAuthorities().toArray()[1]))
.getSource().getPrincipal());
} catch (IndexOutOfBoundsException e) {
return null;
}
}
如果没有管理员以用户身份登录,则会引发 IndexOutOfBoundsException
,因为在这种情况下,阵列中不会有SwitchUserGrantedAuthority
。