Xpages 如果用户有多个角色,如何让用户选择一个角色访问应用程序?

Xpages 如果用户有多个角色,如何让用户选择一个角色访问应用程序?,xpages,Xpages,我们有一个xpage应用程序,需要用户登录(使用lotusnotesid和密码)。如果用户成功登录,它会将用户重定向到指定页面(例如home.xsp) 起初,应用程序很简单,一个用户在应用程序中有一个角色。每个角色在程序中都有不同的功能和界面。(这也得到了用户的同意)。 请设想下表是关于用户和用户角色的 Username | Role Alan | admin Ben | user John | leader Judy | developver Sam

我们有一个xpage应用程序,需要用户登录(使用lotusnotesid和密码)。如果用户成功登录,它会将用户重定向到指定页面(例如home.xsp)

起初,应用程序很简单,一个用户在应用程序中有一个角色。每个角色在程序中都有不同的功能和界面。(这也得到了用户的同意)。 请设想下表是关于用户和用户角色的

Username | Role
Alan     | admin
Ben      | user
John     | leader
Judy     | developver
Sam      | manager
Susan    | senior
Tom      | user
最近,我们的用户改变了主意,他们希望在应用程序中有多个角色。请考虑以下情况:

Username | Role
Alan     | admin,leader
Ben      | user, admin
John     | leader, manager
Judy     | developver
Sam      | manager, user
Susan    | senior,manager, user
Tom      | user
根据上表,一些用户在程序中有多个角色。由于每个角色在程序中具有不同的功能和界面,我们注意到,如果用户有多个角色,界面将看起来不整洁,一些功能将无法正常工作。因此,我们考虑强制用户选择一个角色登录

在指定页面(例如home.xsp)中,用户成功登录后将显示该页面。我们试图找出用户是否有多个角色,因此我们将以下代码放入beforePageLoad事件中

var roles = context.getUser().getRoles()
//if the user has multiple roles, force them to other page
if(roles.length > 1)
{
    context.redirectToPage("chooserole.xsp");
}
else
{
    //do nothing
}
在chooserole.xsp中,页面将找到用户拥有的角色,然后要求用户选择一个登录。所以页面看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"><xp:label value="Please select user role" id="label1" style="margin-left:200.0px"></xp:label>
<xp:text escape="true" id="computedField2" rendered="false">
    <xp:this.value><![CDATA[#{javascript:context.getUser().getRoles()
}]]></xp:this.value>
</xp:text><xp:br></xp:br>

<xp:radioGroup id="radioGroup1" layout="pageDirection" style="margin-left:100.0px" value="#{applicationScope.role}">
    <xp:selectItems>
        <xp:this.value><![CDATA[#{javascript:getComponent("computedField2").getValue();}]]></xp:this.value>
    </xp:selectItems>
</xp:radioGroup>

<xp:br></xp:br>
<xp:button value="Login" id="button1" style="height:35.0px;margin-left:200.0px">
    <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
        <xp:this.action><![CDATA[#{javascript:var rolevalue = getComponent("radioGroup1").getValue();
applicationScope.put(role,rolevalue);
context.redirectToPage("Home.xsp");}]]></xp:this.action>
    </xp:eventHandler></xp:button><xp:button value="Cancel" id="button2" style="height:35.0px;margin-left:30.0px"></xp:button><xp:br></xp:br>

</xp:view>

当我们使用多角色帐户运行该程序时,该程序可以将我们重定向到chooserole.xsp,但是,在该页面中,无论我们选择哪个角色,我们都只保留在chooserole.xsp中

我们猜测问题出在beforePageLoad部分,因为在该部分中,我们检查多个角色,如果用户有多个角色,它会将用户重定向到指定的页面

我们不了解的一点是,在chooservole.xsp中,我们要求用户选择一个角色登录,当用户选择一个角色时,该角色应将用户指向home.xsp。但是,home.xsp似乎“认为”用户有多个角色,因此它将用户保留在chooservole.xsp中

我们是不是在编码上做错了什么?我们试图删除beforePageLoad中的代码,并将其放入afterPageLoad中,但程序仍将用户保留在chooserole.xsp中

谢谢你的建议。多谢各位

参考资料:


如果用户有多个角色,则在home.xsp的beforePageLoad事件中进行测试

如果是,则重定向到chooserole.xsp。您可以让用户选择一个角色并将其放入applicationScope变量中。然后重定向回home.xsp

用户仍有多个角色。它重定向到choosetrole.xsp。。。欢迎来到不定式循环


解决方案:

为用户的一个角色使用sessionScope变量(不是applicationScope变量,因为它在所有用户之间共享),例如
sessionScope.role

如果
sessionScope.role
未定义
如果(!sessionScope.containsKey(“角色”){…

如果未定义,则将其设置为用户拥有的一个角色;如果用户拥有多个角色,则重定向到chooservole.xsp

将chooserole.xsp中的
sessionScope.role
设置为用户已选择的角色,并重定向回home.xsp

现在,
sessionScope.role
有一个值(一个角色),您可以继续处理home.xsp内容


确保您在菜单中或在任何使用一个角色的地方测试
sessionScope.role
,而不再是
context.getUser().getRoles()

是的,您是对的。实际上,我们认为应用程序范围值会让程序“知道”用户想要登录的角色。但结果是我们犯了一个错误,程序只是在不断循环。我们仍然需要弄清楚如何让用户选择一个角色登录xpages,而不是更改访问控制列表中的角色。@初学者您差不多做到了:您只需要检查applicationScope.role,然后使用applicationScope.role中的值与roleapplicationScope中的值对于应用程序的所有用户都是相同的。正如Knut所说,您应该使用
sessionScope
。尽管如此,正如Knut所说,您不能覆盖Domino的ACL角色设置。在整个应用程序的其余部分,您将无法依赖于编码中的设置应用程序。您必须将其更改为使用此sessionScope值。此时可能需要后退一步,重新设计应用程序,以避免使用ACL级别的角色,并在配置文档中将伪角色分配给用户。@PaulStephenWithers doh!当然它应该基于sessionScope!它必须是我写这篇评论时太早了:-)我会去重新审视“需要选择角色”的方法。你最好扭转这个过程。设计一个适用于虚构的拥有所有角色的“超级用户”的应用程序,然后在角色较少时开始限制选择。用户不会认为自己是“扮演角色”但作为“做他们的工作”。避免引入基于角色的模式