SwitchUserFilter与早期管理员用户保持联系

时间:2014-08-31 11:01:36

标签: java spring-security

我尝试将用户从ADMIN切换为USER。但是在切换后我注意到我丢失了ADMIN的主要信息。

如何通过ADMIN检查此用户是否已切换?

2 个答案:

答案 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