2016-11-15 99 views
1

我們有一個需要用戶登錄的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/

+1

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

回答

1

你試驗home.xsp的beforePageLoad事件,如果用戶有一個以上的角色。

如果是,則重定向到chooserole.xsp。您讓用戶選擇一個角色並將其放入applicationScope變量中。然後你重定向回到home.xsp。

用戶還有更多的角色。它重定向到chooserole.xsp ...歡迎來到不定式循環。


解決方案:

使用sessionScope變量爲用戶的一個作用(而不是作爲它的之間所有用戶共享一個applicationScope變量)例如sessionScope.role。在home.xsp的beforePageLoad事件

測試是否sessionScope.role未定義與
if (!sessionScope.containsKey("role")) { ...
如果它是不確定的,然後將其設置爲用戶擁有一個角色或重定向到chooserole.xsp如果用戶有一個以上的角色。

將chooserole.xsp中的sessionScope.role設置爲用戶選擇並重定向回home.xsp的角色。

現在,sessionScope.role有一個值(一個角色),您可以繼續使用home.xsp內容。

確保在你的菜單測試或任何你使用一個作用,爲sessionScope.role,而不是context.getUser().getRoles()了。

+0

是的,你是對的。實際上,我們認爲應用程序範圍值會讓程序「知道」用戶想要登錄的角色。但結果是我們犯了一個錯誤,程序只是保持循環。我們仍然需要弄清楚如何讓用戶選擇一個角色來登錄xpages,而不是更改訪問控制列表中的角色。 – beginner

+0

@beginner你幾乎在那裏:你只需要檢查applicationScope.role,然後使用applicationScope.role中的值作爲角色 –

+0

applicationScope對於應用程序的_all_用戶將是相同的值。正如Knut所說,你應該使用'sessionScope'。無論如何,正如Knut所說,您無法重寫Domino的ACL角色設置。在整個應用程序的其他部分,您將無法依賴於您的代碼。您必須將其更改爲使用此sessionScope值。現在回過頭來重新構建應用程序以避免使用ACL級角色,並在配置文檔中爲用戶分配僞角色,這可能是合適的。 –

相關問題