2015-05-31 50 views
1

我正在使用關於用戶權限的相當複雜的邏輯處理單個頁面的企業應用程序。它的大部分工作完全在客戶端與使用AJAX來回發送JSON的後端服務器進行通信。棘手的部分是我需要根據每個實體實施權限機制,而我不知道如何以正確的方式進行。如何處理單個頁面應用程序中的用戶權限

爲了清楚地在這裏解釋一下示例代碼中,我有後臺UserNode 2實體類:

class User { 
    Long id; 
} 
class Node { 
    Long id; 
    String name; 
    Status status; 
    Node parent; 
    List<User> admins; 
} 
enum Status { 
    STATUS_1, STATUS_2 
} 

我送JSON父節點的服務器:

{id: 1, name: "Node name 1", status: 'STATUS_1'} 

而且用一堆子節點接收JSON:

[ 
    {id: 11, name: "Node name 1.1", status: 'STATUS_1'}, 
    {id: 12, name: "Node name 1.2", status: 'STATUS_1'} 
] 

在客戶端,他們都顯示在一個樹狀結構,像這樣:

UI

現在棘手的問題:

  1. 與應用程序的工作可以看到樹簡單的用戶,但可以什麼都不會改變。

  2. 用戶可以更改節點名,如果他是中節點的admins或任何其節點。

  3. 管理員還可以更改節點的狀態,從STATUS_1STATUS_2,但只有當所有節點具有STATUS_2狀態。

  4. 有一個超級管理員的列表,可以做任何他們想做的事情:改變任何節點的屬性,改變他們想要的狀態。

所以不知何故,在客戶端上樹的渲染過程中,我需要知道哪些用戶可以或不可以與每個頁面上的節點做。我不能只在整個應用程序中爲用戶分配角色,因爲用戶權限因節點而異。此外,我無法在客戶端看到整個圖片,因爲子節點可能未加載。 如何在這種情況下管理用戶權限?什麼是正確的方式或模式使用?

我應該附加一些角色對象到每一個節點,也許一堆代表什麼用戶可以或不可以做這樣的標誌:

{ 
    id: 12, 
    name: "Node name 1.2", 
    status: "STATUS_1", 
    canChangeName: true, 
    canChangeStatus: false 
} 

這看起來非常愚蠢的我。

+1

我其實喜歡國旗的方法。當樹被創建時,所有的東西都被計算出來,所以所有的UI都要讀取標誌。使UI實現簡單直接,使測試變得簡單。 – dbugger

+0

@dbugger直到其中只有少數人可以使用,但是可以使用實體執行各種各樣的任務,因此每個可以在實體的頁面上執行的每個非常小的任務都以幾十個標誌結束。也有些情況下,你不能用true或false來表示權限,在我的例子中只有2個狀態,但可以有更多的狀態,所以對於每個狀態我需要知道用戶是否可以選擇它。 – panfil

+0

鑑於您的限制,如果不簡化和/或抽象您的權限,就沒有簡單的方法來實現這一點。我敢打賭,這些任務中很少有一些獨立於所有其他任務,並且通常會在小組中打開或關閉。我會盡一切努力獲得它,所以你的用戶界面可以檢查一兩個國旗做生意。 – dbugger

回答

2

我通常使用ACL類在應用程序中解決複雜的(而不是非常複雜的)基於權限的任務。

我有簡單的輕量級類,需要一個模型,正在檢查的權限以及用戶對象到構造函數中。他們有一堆名稱爲canXXXX()的方法。如果需要的話,這些方法可以選擇使用一些參數。

如果您在正面和背面具有相同的模型類,您甚至可以在這兩種情況下重用ACL。

你可以使用這種方法嗎?

+0

Thaks回覆。該方法的問題在於,這些ACL類需要在前端(JS)和後端(例如Java)上進行復制。所以除非我使用類似node.js的東西,否則我不能重用它們。 – panfil

相關問題