我們有一個需要用戶登錄的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事件中。
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/
我會去重溫'需要選擇角色'的方法。你可能會更好地扭轉這個過程。設計一個適用於具有所有角色的虛擬「超級用戶」的應用程序,然後在較少角色出現時開始限制選擇。用戶並不認爲自己是「扮演角色」,而是「做他們的工作」。避免引入基於角色的模式 – stwissel