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

时间:2016-11-15 06:10:37

标签: xpages

我们有一个xpage应用程序,要求用户登录(使用lotus notes id和密码)。如果用户成功登录,它会将用户重定向到指定的页面(例如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 Event中。

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部分,因为在那部分,我们检查多个角色,如果用户有多个角色,它会将用户重定向到指定的页面。

我们不理解的一件事是在chooserole.xsp中,我们要求用户选择一个要登录的角色,当用户选择一个角色时,该角色应该将用户引导到home.xsp。但是,home.xsp似乎“认为”用户有多个角色,因此它将用户保留在chooserole.xsp中。

我们在编码中做错了吗?我们试图删除beforePageLoad中的代码并放入afterPageLoad但程序仍然将用户保留在chooserole.xsp中。

请感谢您的建议。谢谢。

参考文献:

https://lostinxpages.com/2014/01/06/finding-user-roles-in-xpages/

Access Control with a multi database application

XPages: context.getUser().getRoles() working sporadically

http://flylib.com/books/en/2.348.1.172/1/

1 个答案:

答案 0 :(得分:1)

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

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

用户还有一个以上的角色。它重定向到chooserole.xsp ...欢迎使用不定式循环。

解决方案:

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

如果sessionScope.role未定义,则在home.xsp的beforePageLoad事件中进行测试 if (!sessionScope.containsKey("role")) { ...
如果未定义,则将其设置为用户拥有的一个角色,如果用户有多个角色,则将其重定向到chooserole.xsp。

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

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

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