我们有一项要求,其中管理用户需要在管理员(角色:管理员)管理多个用户(角色:用户)的环境中作为特定用户进行代理。
例如,如果我们在数据库中有以下用户(admin,user1,user2,user3),我们希望管理员代理为“user2”并在某些情况下使用该系统。我们的Web应用程序中的身份验证基于用户名/密码凭据,当管理员没有“user2”的密码时,可以使用哪些机制代理为“user2”。为了审计目的,应用程序如何跟踪此类访问,以提及“admin”代理了“user2”并执行了某些操作。
我正在寻找有关在我们的j2ee(jboss seam)网络应用程序中支持此功能的建议。
答案 0 :(得分:2)
您可以实现自定义身份验证方法,该方法首先检查user_name / user_pw 如果失败,请检查user_name / admin_pw,以便使用admins密码允许以任何用户身份登录。
答案 1 :(得分:1)
您可以创建自定义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
*/
}
要启用代理,请创建一个commandButton
<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>')}"/>
我希望它对你有用!
答案 2 :(得分:0)
我这样做的方式通常涉及保持两个身份,我称之为逻辑和物理。逻辑身份用于授权检查,物理身份是实际身份(坐在键盘后面的用户)。在正常情况下,逻辑身份=物理身份,但是为了允许用户(通常是管理员)“充当”另一个用户,您可以将逻辑身份更改为目标用户的身份。这样,应用程序就会根据逻辑用户的行为进行操作,但您始终会跟踪物理用户实际坐在计算机后面的人员。 希望有所帮助。