![](/img/trans.png)
[英]Access Control and RBAC (Roles Based Access Control) In PHP Hybrid (procedural and OOO) application
[英]Implementing Roles based access control in php application
我一直在為我的大學開發一個PHP應用程序,該應用程序需要基於角色的訪問控制。 我遵循的方法是為每個角色創建一個單獨的MySQL用戶。 因此,每個角色都有一個單獨的數據庫用戶。 這些數據庫用戶中的每個用戶都具有角色所需的最小表集的特權。
現在,我的問題是這實際上是否是處理基於角色的應用程序的正確方法。 我之所以對此表示懷疑,是因為現在是時候讓該系統在線(帶有GoDaddy托管)了,我發現他們不允許創建具有表特定特權的用戶。 實際上,他們甚至不允許直接通過SQL腳本創建用戶(系統上的角色創建涉及通過執行SQL命令的php腳本創建用戶)。
因此,我現在正在考慮我的方法是否正確。 實現這種基於角色的系統的標准方法是什么?
這是我的第一個實時項目,因此我在實際交付實際項目方面並沒有太多的經驗。
除非您不是托管人,否則您可能不想通過腳本動態創建數據庫用戶。 考慮一下:
數據庫用戶是與您的應用程序而非最終用戶進行交互的組件。
因此,請為您的應用程序保留一個數據庫,並使用專用表來構建您的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 )
您基本上在這里有三件事:
這是基本設置。 其他表只是將各個部分連接在一起的助手表。
您的代碼將處理其余部分。 設置一個(或更好的)類來完成繁重的工作。 然后將您的ACL實例傳遞給User類(當然可以實現其他實現。請參見文章底部)。
<?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 );
}
}
您應該了解基本概念。 實際的實施取決於您。 您可能需要考慮的事項:
User
一部分,還是成為獨立的組件? 這些問題取決於您喜歡什么以及您的體系結構。 編碼愉快!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.