以某个用户的代理身份登录
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】:我这样做的方式通常涉及保持两个身份,我称它们为逻辑和物理。逻辑身份用于授权检查,物理身份是实际身份(坐在键盘后面的用户)。在正常情况下,逻辑身份 = 物理身份,但为了允许用户(通常是管理员)“充当”另一个用户,您可以将逻辑身份更改为目标用户的身份。这样,应用程序会根据逻辑用户运行,但您始终可以跟踪实际与物理用户坐在计算机后面的人。 希望对您有所帮助。
【讨论】:
以上是关于以某个用户的代理身份登录的主要内容,如果未能解决你的问题,请参考以下文章
当访问令牌过期并且我们需要再次登录才能以普通用户身份继续时,我们如何保持用户登录