2013-04-22 53 views
1

我有一個網站,我們的客戶登錄以查看他們自己的數據。每個客戶只能看到自己的數據(當然),不同的用戶可以訪問一個客戶的不同頁面。另外 - 編輯必須看到所有數據。Episerver中的角色組合

我想根據角色設置訪問權限,以確定用戶屬於哪個客戶,以及用戶可以訪問哪些頁面。

組:

  • Customer1Role
  • Customer2Role
  • TicketViewerRole
  • ChangeRequestRole

用戶:

  • Cust1_LowLevelUser。 角色Customer1Role,TicketViewerRole
  • Cust1_HighLevelUser 角色Customer1Role,TicketViewRole,ChangeRequestRole
  • Cust2_LowLevelUser。 角色Customer2Role,TicketViewerRole
  • Cust2_HighLevelUser 角色Customer2Role,TicketViewRole,ChangeRequestRole

頁面結構

我們已經創建了一個頁面樹,每個客戶都有自己的「根頁面」只能訪問各自的角色。在該節點下方,我們創建了數據特定頁面的實例,這些頁面具有基於用戶角色以及客戶角色的訪問權限。

Customer1 (Customer1Role) 
    |--TicketsForCust1 (Customer1Role, TicketViewerRole) 
    |--ChangeRequestsForCust1 (Customer1Role, ChangeRequestRole) 
Customer2 (Customer2Role) 
    |--TicketsForCust2 (Customer2Role, TicketViewerRole) 
    |--ChangeRequestsForCust2 (Customer2Role, ChangeRequestRole) 

亟待解決的問題:

我們如何防止用戶Cust2_HighLevelUser看見ChangeRequestsForCust1

EPiServer只會檢查是否有任何角色足以授予訪問權限,並且由於用戶屬於ChangeRequestRole,因此無論客戶的特定角色如何,他們都將被授予訪問權限。是否有可能讓EPiServer檢查客戶角色和頁面角色?

還是我必須從另一個角度看這個?請讓我知道你是否遇到過這個問題並以另一種方式解決問題。

對不起,很長的文章,但希望我明白我的觀點。

回答

2

訪問權模式中沒有拒絕標誌,因此您需要使用該角色結構自行編碼。

代碼添加到您的模板基類,拒絕訪問,併爲PageTree控制,你可以做這樣的事情:

protected void NavSubPageTreeFilter(object sender, EPiServer.Filters.FilterEventArgs e) 
{ 
    for (int i = e.Pages.Count - 1; i > -1; i--) 
    { 
     PageData pd = e.Pages[i]; 

     if (yourUser.IsInRole("blabla") && ... etc) 
     { 
      e.Pages.RemoveAt(i); 
     } 
    } 
} 
+0

謝謝!對於如何以不同方式來組織角色來改進解決方案,您有任何建議嗎? – 2013-04-23 06:27:01

+0

您需要一個「Customer1TicketViewerRole」。如果你不想手動創建它,那麼可能通過添加你自己的RoleProvider。這樣你可以組裝一個名爲「Customer1TicketViewerRole」的「動態」角色併爲其設置頁面權限。 – 2013-04-23 13:39:31

+0

感謝你的努力,約翰。我們現在已經實施了一個解決方案,在父頁面上添加一個動態屬性,該屬性定義您必須在查看其子級時所處的客戶角色。由於維護,我們確實希望遠離客戶特定的角色。 – 2013-04-29 12:16:14