2014-11-24 130 views
2

我一直在爲我的大學開發一個PHP應用程序,它需要基於角色的訪問控制。我遵循的方法是爲每個角色創建一個單獨的MySQL用戶。所以每個角色都有一個單獨的db用戶。這些db用戶中的每一個都擁有該角色所需的最少一組表的權限。在php應用程序中實現基於角色的訪問控制

現在,我的問題是這是否是一個正確的方式來處理基於角色的應用程序。我遇到這個疑問的原因是因爲現在當系統聯機時(使用GoDaddy託管),我發現他們不允許創建具有表特定權限的用戶。事實上,他們甚至不允許通過SQL腳本直接創建用戶(系統上的角色創建涉及通過執行SQL命令的php腳本創建用戶)。

由於這個原因,我現在正在考慮我的方法是否事實上是正確的方法。實施這種基於角色的系統的標準方式是什麼?

這是我的第一個現場項目,所以我在實際提供真正的項目方面沒有太多的經驗。

回答

3

除非您不是託管商,否則您可能不希望通過腳本動態創建數據庫用戶。想一想:

數據庫用戶是一個組件,它與您的應用程序進行交互,而不是與最終用戶進行交互。

所以,堅持一個數據庫爲您的應用程序,並使用專用的表來建立您的ACL。 你的數據庫模式可能是這樣的:

users(id:pk, name) 
roles(id:pk, name) 
permissions(id:pk, key, description) 
permission_role(permission_id:fk, role_id:fk) 
role_user(role_id:fk, user_id:fk) 

基本上,你這裏有三件事情:

  • 用戶:沒什麼特別的。只是一個用戶,可以通過它的唯一定義ID
  • 權限:基本上只是一個鍵將被查詢您的腳本中檢查權限存儲。
  • 角色:用戶和權限之間的膠水。用戶所屬的角色和權限的總和將定義用戶被允許執行的操作的總和。

這是基本設置。其他表只是幫助表連接在一起。

您的代碼處理剩下的部分。建立一個(或更多更好)的課程來完成繁重的工作。然後將你的ACL實例傳遞給你的用戶類(其他實現當然是可能的,請參閱帖子的底部)。

<?php 

class Acl implements AclInterface { 

    public function hasPermissionTo($action) 
    { 
     // Query DB and check if a record exists 
     // in the role_user table where the 
     // user_id matches with the current user 
     // and join the role_id with `roles` and then 
     // with `permission_role` to see if the user 
     // is permitted to perform a certain action 
    } 

} 

class User { 

    protected $acl; 

    public function __construct(AclInterface $acl) 
    { 
     $this->acl = $acl; 
    } 

    public function hasPermissionTo($action) 
    { 
     return $this->acl->hasPermissionTo($action); 
    } 

} 

您應該瞭解基本概念。實際的實施取決於你。您可能需要考慮的事項:

  • 您是否希望自己的ACL成爲User的一部分,或者是一個獨立的組件?
  • 你想如何將當前用戶傳遞給ACL?您是否想將當前用戶的實例傳遞給ACL,或者只是將用戶ID傳遞給該實例?

這些問題取決於你喜歡什麼,你的體系結構。 快樂編碼!

+0

感謝。其實我在應用程序和數據庫中也有類似的安排。但是,我沒有完全後利用它認爲具有每個角色的不同用戶就可以解決我的problem.:-/ – kusa4indigeek 2014-11-24 11:44:35

+0

每次訪問有一個數據庫調用involved.Isnt一個性能問題? – 2015-01-21 17:18:35

+1

@nationbest你可能會考慮獲取所有ACL相關數據每個請求後,保存在ACL對象來克服這個問題 – thpl 2015-01-23 06:58:16

相關問題