我们有一个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
答案 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()
使用一个角色的任何地方进行测试。