2011-04-22 54 views
0

我正在實施一個類來管理我的網站上的用戶權限。棘手的類設計問題

例如:員工可以查看客戶記錄,但沒有別的,僱主可以查看客戶以及管理員工,管理員既可以做這些事情,也可以管理僱主。

到目前爲止,我所得到的是:

  • 我已經存儲的權限列表,如addCustomerdelCustomer等每個權限被鏈接到用戶角色的列表,它被允許執行該操作。

  • 我已經建立了一個簡單的權限類。我使用的是這樣的:

    if($ permissions-> can('addCustomer')) echo「Add Customer」; else echo'不允許添加客戶';

然而,棘手的部分是,在一些地方,我需要更具體。例如:客戶已獲得許可:readMsgs,允許他閱讀他和員工之間的消息。但是,如果他有這個權限,那麼他就可以簡單地從改變網址:

site.com/messages/read/100 

site.com/messages/read/101 

而且讀消息#101爲好,這可能是另一種客戶和員工之間。除了自己之外,客戶不應該能夠閱讀任何人的消息。

同樣,客戶已經拿到了editCustomer許可,允許他前往編輯自己的個人資料:

site.com/customers/99 

(其中99是其客戶ID)

但如果他去 site.com/customers/100

他不應該被允許訪問該頁面。

我該如何解決這個問題?理想情況下,我希望能夠將ID傳遞給權限類。例如:

if (! $permissions->can('readMsg', $msgId)) 
    echo 'not allowed'; 

if (! $permissions->can('editCustomer', $requestedCustomerId)) 
    echo 'not allowed'; 

任何想法我將不得不重構我的類結構以允許上述類型的東西?

回答

1

我會更精細的在我的權限的分類(例如,「readOwnMsgs」與「readAnyMsg」)。這會詳細說明你的權限檢查代碼(例如,site.com/messages/read/###會沿着「如果canReadAnyMsg或canReadOwnMsg和消息作者是當前用戶的情況下繼續」)行,則表明這個邏輯應該是封裝在按資源類型細分的不同類別中,或者任何其他情況可能對作出此類決策所需的上下文信息有影響。

1

我會有一個消息類canRead(User)函數。這將檢查用戶的權限並說:「哦,我是經理給員工的一條消息,除非用戶是消息的接收者,否則他們無法讀取它。」或者簡單地說:「我是經理給員工的消息,用戶是經理,所以他可以閱讀。」

我在英文打字出來,因爲我吸了PHP(這似乎是選擇的語言。)

+0

我知道Java,所以隨時輸入,如果那會更容易。但問題是,班級如何知道它是否要求從員工X讀取消息給客戶X,或者是否要求編輯客戶X的個人資料?在這兩種情況下,一旦類知道它是哪一個,它就可以檢查當前用戶是否是客戶Y,在這種情況下請求將被拒絕。 – 2011-04-23 00:20:50

+0

我不確定我是否瞭解後續問題的性質。你的請求如何不知道? 'messages/read/XYZ'很清楚地定義了行爲。 – corsiKa 2011-04-23 01:41:37