以某个用户的代理身份登录

Posted

技术标签:

【中文标题】以某个用户的代理身份登录【英文标题】:log in as a proxy for a certain user 【发布时间】:2010-04-18 16:39:01 【问题描述】:

我们有一个要求,其中管理用户需要在多个用户(角色:用户)由管理员(角色:管理员)管理的环境中代理。

例如,如果我们在数据库中有以下用户(admin、user1、user2、user3),我们希望 admin 作为 'user2' 代理并在某些场景中使用系统。我们的 Web 应用程序中的身份验证基于用户名/密码凭据,当管理员没有“user2”的密码时,可以使用哪些机制代理“user2”。应用程序如何跟踪此类访问以进行审计以提及“admin”已代理“user2”并执行了某些操作。

我正在寻找有关在我们的 j2ee (jboss seam) Web 应用程序中支持此功能的建议。

【问题讨论】:

我正在寻找与此类似的东西 (performancemanager.successfactors.eu/doc/roboHelp/…) 【参考方案1】:

您可以实现自定义身份验证方法,该方法首先检查 user_name/user_pw 如果失败,请检查 user_name/admin_pw,因此使用管理员密码将允许以任何用户身份登录。

15.3.2. Writing an authentication method

【讨论】:

我不以明文形式存储 admin_pw,它以 MD5 哈希的形式存在,因此我无法检查 user_name/admin_pw。 那么你仍然可以在查找之前根据给定的密码计算MD5。【参考方案2】:

您可以创建自定义 registerAdminAsUser() 方法。

@Name("authenticationProxy")
public class AuthenticationProxy 

    private @In org.jboss.seam.security.Identity identity;

    /**
      * Starting with Seam 2.1+, you should use Credentials instead of Identity
      * To collect your username and password
      *
      * Your JSF Form should looks like
      *
      * <h:inputText value="#credentials.username"/>
      * <h:inputSecret value="#credentials.password"/>
      */
    private @In org.jboss.seam.security.Credentials credentials;

    public String registerAdminAsUser2() 

        identity.getCredentials().setUsername("user2");

        /**
          * Here you should provide any role which should be assigned to User2
          */
        identity.addRole("<A_ROLE>");
        identity.addRole("<OTHER_ROLE>");
        identity.addRole("<ANOTHER_ROLE>");

        /**
          * Do not call login method because it will call authenticate one
          * You do not have User2 password
          */
        // identity.login();

        return "loggedIn";
    

    /**
      * Be aware you may need a unregisterAdminAsUser2
      */


要启用您的代理,请创建一个命令按钮

<h:commandButton value="register Admin as User2" value="#authenticationProxy.registerAdminAsUser2" rendered="#credentials.username == 'admin'"/>

要使用一些JSF组件,请执行以下操作

<h:commandLink rendered="#s:hasRole('<ANY_ROLE_ASSIGNED_TO_USER2_GOES_HERE>')"/>

希望对你有用!

【讨论】:

谢谢。我们试图在这里模拟以 user2 身份登录,是否可以将 user2 特定角色添加到这个新身份。如果是这样,我们不需要任何为“user2”做某事的渲染检查。 “proxiedByAdmin”是虚拟密码还是管理员的真实密码? @Samuel 是否可以将 user2 特定角色添加到这个新身份?是的,我会更新答案【参考方案3】:

我这样做的方式通常涉及保持两个身份,我称它们为逻辑和物理。逻辑身份用于授权检查,物理身份是实际身份(坐在键盘后面的用户)。在正常情况下,逻辑身份 = 物理身份,但为了允许用户(通常是管理员)“充当”另一个用户,您可以将逻辑身份更改为目标用户的身份。这样,应用程序会根据逻辑用户运行,但您始终可以跟踪实际与物理用户坐在计算机后面的人。 希望对您有所帮助。

【讨论】:

以上是关于以某个用户的代理身份登录的主要内容,如果未能解决你的问题,请参考以下文章

当访问令牌过期并且我们需要再次登录才能以普通用户身份继续时,我们如何保持用户登录

Keycloak 身份代理 API

在 web.config 中设置具有身份验证的代理以访问 Internet

Keycloak:如何仅通过身份提供者登录

Oracle用户为啥都可以以sysdba身份登录

Shiro01 功能点框图架构图身份认证逻辑身份认证代码实现