ホームページ >PHPフレームワーク >ThinkPHP >ThinkPHP6 を使用してユーザー役割権限管理を実装する方法

ThinkPHP6 を使用してユーザー役割権限管理を実装する方法

WBOY
WBOYオリジナル
2023-06-20 22:06:271568ブラウズ

ビジネスの継続的な発展に伴い、多くの中小企業は独自のユーザー保守システムを備えており、ユーザー権利管理はその重要な部分を占めています。システム内の機密情報を保護し、ビジネスの正常な運用を確保するには、ロール権限管理メカニズムを使用して、異なるロールのユーザーが指定されたリソースとデータのみにアクセスできるようにする必要があります。

この記事では、ThinkPHP6 フレームワークを例として、それが提供する権限制御ミドルウェアと拡張パッケージを使用してユーザー ロールの権限管理を実装する方法を紹介します。

  1. ロール テーブルと権限テーブルの作成

最初に 2 つのデータベース テーブルを定義する必要があります。1 つはシステム ロール情報を保存するために使用されるロール テーブルで、もう 1 つは権限テーブル 、システム権限情報を保存するために使用されます。

CREATE TABLE role (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主キー',
name varchar ( 20) NOT NULL COMMENT 'ロール名',
description varchar(50) NOT NULL COMMENT 'ロールの説明',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ロール テーブル';

CREATE TABLE permission (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主キー ',
name varchar(20) NOT NULL COMMENT '権限名',
description varchar(50) NOT NULL COMMENT '権限の説明',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Permission table';

ThinkPHP が提供するデータベース移行ツールを使用してテーブルを作成できます。 :phpは移行を考えます:実行します。

  1. ロールと権限モデルの作成

次に、ロールと権限モデルを作成する必要があります。 app/model ディレクトリに、Role.php および Permission.php ファイルを作成します。コードは次のとおりです:

namespace appmodel;

use thinkModel;

クラスの役割はモデルを拡張します。
#{

protected $table = 'role';

}

namespace appmodel;

use thinkModel;

class Permission extends Model
{

protected $table = 'permission';

}

  1. ロールと権限の関連付けテーブルの作成

ユーザーは複数のロールを持つ可能性があるため、ロールは複数の権限に対応する場合もあるため、ロールと権限の関連付けテーブルを作成する必要があります。データベースに role_permission テーブルを作成します。

CREATE TABLE role_permission (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主キー',
role_id int ( 11) NOT NULL コメント 'ロール ID',
permission_id int(11) NOT NULL コメント '権限 ID',
主キー (id),
KEY role_id (role_id),
KEY permission_id (permission_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT ='ロールと権限の関連付けテーブル';

モデル内のロールと権限の間の多対多の関係を定義します:

namespace appmodel;

use thinkModel;

class ロールはモデルを拡張
{

protected $table = 'role';

public function permissions()
{
    return $this->belongsToMany(
        Permission::class,
        'role_permission',
        'role_id',
        'permission_id'
    );
}

}

namespace appmodel;

use thinkModel;

class Permission extends Model
{

protected $table = 'permission';

public function roles()
{
    return $this->belongsToMany(
        Role::class,
        'role_permission',
        'permission_id',
        'role_id'
    );
}

}

  1. Define middleware

ThinkPHP6 では、ミドルウェアはリクエストを処理するための強力なツールであり、ミドルウェアを通じて権限制御を実装できます。 CheckAuth ミドルウェアを作成して、ユーザーが現在の操作を実行する権限を持っているかどうかを判断します。次のコードを使用して、appmiddleware ディレクトリに CheckAuth.php ファイルを作成します:

namespace appmiddleware;

use think acadeDb;
use think acadeSession;
use think acadeConfig;

class CheckAuth
{

public function handle($request, Closure $next)
{
    if (Session::has('user')) {
        $roles = Db::table('user')
            ->alias('u')
            ->leftJoin('role_user ru', 'u.id = ru.user_id')
            ->leftJoin('role r', 'ru.role_id = r.id')
            ->where('u.id', '=', Session::get('user')->id)
            ->field('r.id')
            ->select();
        $permissions = Config::get('permissions');
        foreach ($roles as $role) {
            $rolePermissions = Db::table('role_permission')
                ->where('role_id', '=', $role->id)
                ->field('permission_id')
                ->select();
            foreach ($rolePermissions as $rolePermission) {
                if (in_array($rolePermission->permission_id, $permissions)) {
                    return $next($request);
                }
            }
        }
    }
    abort(403, '没有权限');
}

}

このミドルウェアは、まず現在のユーザーが所有するすべてのロールをクエリします。ロールを走査するときは、クエリを実行します。 each ロールが所有するアクセス許可が現在のリクエストと一致する場合、実行の続行が許可されます。そうでない場合は、403 エラーが返されます。

  1. 権限設定ファイルの作成

システム権限の管理を容易にするために、ThinkPHP が提供する Config 関数を使用して、すべての権限を構成ファイルに書き込むことができます。 config ディレクトリに Permissions.php ファイルを作成します。コードは次のとおりです:

return [

1 => 'user.create',
2 => 'user.read',
3 => 'user.update',
4 => 'user.delete',

];

これを渡すことができます。キー/値 システムのすべての権限を記録するには、キーは整数、値は権限の名前を示す文字列です。

  1. ミドルウェアの適用

最後に、上記のミドルウェアを実際に適用する必要があります。 config ディレクトリ内の middleware.php ファイルを開き、CheckAuth ミドルウェアを追加します。

return [

// ...
'check_auth' => appmiddlewareCheckAuth::class,

];

ミドルウェアの適用順序は、配列のキー名に従って前から後ろに実行されます。配列の添字を使用してミドルウェアの実行順序を調整できます。

アクセス許可制御が必要なコントローラーまたはメソッドでは、ミドルウェア メソッドを使用して CheckAuth ミドルウェアをバインドできます。

namespace appcontroller;

think acadeView を使用;

class UserController
{

public function create()
{
    $this->middleware('check_auth');
    // ...
}

}

これまで、ThinkPHP6 を使用してユーザー ロールの権限管理を実装するためのすべての手順が完了しました。実際のビジネス ニーズに応じて、上記のサンプル コードを拡張および改善できます。

以上がThinkPHP6 を使用してユーザー役割権限管理を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。