簡體   English   中英

在php應用程序中實現基於角色的訪問控制

[英]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 )

您基本上在這里有三件事:

  • 用戶 :沒什么特別的。 只是可以由其ID唯一定義的用戶
  • 權限 :基本上只是一個密鑰存儲區,這些密鑰將在腳本中查詢以檢查權限。
  • 角色 :用戶和權限之間的黏合劑 用戶所屬的角色及其權限的總和將定義允許用戶執行的全部操作以及不允許執行的操作的全部。

這是基本設置。 其他表只是將各個部分連接在一起的助手表。

您的代碼將處理其余部分。 設置一個(或更好的)類來完成繁重的工作。 然后將您的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 );
    }

}

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

  • 您希望ACL成為User一部分,還是成為獨立的組件?
  • 您想如何將當前用戶傳遞給ACL? 您要將當前用戶的實例傳遞給ACL還是僅傳遞用戶ID?

這些問題取決於您喜歡什么以及您的體系結構。 編碼愉快!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM