ThinkPHP6을 사용하여 사용자 역할 권한 관리를 구현하는 방법

WBOY
풀어 주다: 2023-06-20 22:06:27
원래의
1515명이 탐색했습니다.

지속적인 비즈니스 발전으로 인해 많은 중소기업에서는 자체적인 사용자 유지 관리 시스템을 보유하고 있으며, 이에 대해 사용자 권한 관리는 중요한 부분입니다. 시스템의 민감한 정보를 보호하고 비즈니스의 정상적인 운영을 보장하려면 역할 권한 관리 메커니즘을 사용하여 다양한 역할의 사용자가 지정된 리소스 및 데이터에만 액세스할 수 있도록 해야 합니다.

이 기사에서는 ThinkPHP6 프레임워크를 예로 들어 사용자 역할 권한 관리를 구현하기 위해 제공되는 권한 제어 미들웨어 및 확장 패키지를 사용하는 방법을 소개합니다.

  1. 역할 테이블 및 권한 테이블 만들기

먼저 두 개의 데이터베이스 테이블을 정의해야 합니다. 하나는 시스템 역할 정보를 저장하는 데 사용되는 역할 테이블이고, 다른 하나는 시스템 권한 정보를 저장하는 데 사용되는 권한 테이블입니다.

CREATE TABLE role (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='权限表';

我们可以使用ThinkPHP提供的数据库迁移工具来创建表:php think migrate:run。

  1. 创建角色和权限模型

接下来,我们需要创建角色和权限的模型。在app/model目录下创建Role.php和Permission.php文件,代码如下:

namespace appmodel;

use thinkModel;

class Role extends Model
{

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 COMMENT '角色ID',
permission_id int(11) NOT NULL COMMENT '权限ID',
PRIMARY KEY (id),
KEY role_id (role_id),
KEY permission_id (permission_id id int(11) NOT NULL AUTO_INCREMENT COMMENT '기본 키',
name varchar(20) NOT NULL COMMENT '역할 이름',

설명 varchar(50) NOT NULL COMMENT '역할 설명',

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT = '역할 테이블';


CREATE TABLE 권한 (

id int(11) NOT NULL AUTO_INCREMENT COMMENT '기본 키',

이름 varchar( 20) NOT NULL COMMENT '권한 이름',

설명 varchar(50) NOT NULL COMMENT '권한 설명',

PRIMARY KEY (id)
) ENGINE= InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Permission Table';

ThinkPHP에서 제공하는 데이터베이스 마이그레이션 도구를 사용하여 테이블을 생성할 수 있습니다: php think migration:run.

    역할 및 권한 모델 생성

    다음으로 역할 및 권한 모델을 생성해야 합니다. app/model 디렉터리에 Role.php 및 Permission.php 파일을 만듭니다. 코드는 다음과 같습니다.

    namespace appmodel;

    use thinkModel;

      class Role은 Model을 확장합니다
    1. {
    2. protected $table = 'role';
      
      public function permissions()
      {
          return $this->belongsToMany(
              Permission::class,
              'role_permission',
              'role_id',
              'permission_id'
          );
      }
      로그인 후 복사
    }

    < ?php

    namespace appmodel;

    use thinkModel;


    class 권한 확장 모델
    {

    protected $table = 'permission';
    
    public function roles()
    {
        return $this->belongsToMany(
            Role::class,
            'role_permission',
            'permission_id',
            'role_id'
        );
    }
    로그인 후 복사

    }

      역할 및 권한 연관 테이블 생성

      역할이 여러 개인 경우 역할은 여러 권한에 해당할 수도 있으므로 역할과 권한의 연결 테이블을 만들어야 합니다. 데이터베이스에 role_permission 테이블을 생성합니다.

        CREATE TABLE role_permission (
      1. id int(11) NOT NULL AUTO_INCREMENT COMMENT '기본 키',
      2. role_id int(11) NOT NULL COMMENT '역할 ID',
      permission_id int(11) NOT NULL COMMENT '권한 ID',

      PRIMARY KEY (id),

      KEY role_id</code > (<code>role_id),

      KEY permission_id (permission_id)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='역할-권한 연관 테이블'

      모델에서 역할과 권한의 다대다 관계 정의:

      namespace appmodel;

      1. use thinkModel;
      class 역할 확장 모델

      {

      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, '没有权限');
      }
      로그인 후 복사

      }

      < ?php

      namespace appmodel;

      use thinkModel;

      class 권한 확장 모델

      {

      1 => 'user.create',
      2 => 'user.read',
      3 => 'user.update',
      4 => 'user.delete',
      로그인 후 복사

      }

      Define middleware


      ThinkPHP6에서 미들웨어는 요청 처리를 위한 강력한 도구입니다. 미들웨어를 통해 권한 제어를 구현할 수 있습니다. . 사용자에게 현재 작업을 수행할 수 있는 권한이 있는지 확인하기 위해 CheckAuth 미들웨어를 만듭니다. appmiddleware 디렉토리에 CheckAuth.php 파일을 생성합니다. 코드는 다음과 같습니다:

      namespace appmiddleware;

      이 미들웨어는 먼저 현재 사용자가 소유한 모든 역할을 쿼리합니다. 현재 요청과 일치하는 권한이 있으면 실행이 계속 허용되고, 그렇지 않으면 403 오류가 반환됩니다. 🎜🎜🎜권한 구성 파일 만들기🎜🎜🎜시스템 권한 관리를 용이하게 하기 위해 ThinkPHP에서 제공하는 Config 기능을 사용하여 모든 권한을 구성 파일에 쓸 수 있습니다. config 디렉터리에Permission.php 파일을 생성합니다. 코드는 다음과 같습니다. 🎜🎜
      // ...
      'check_auth' => appmiddlewareCheckAuth::class,
      로그인 후 복사
🎜];🎜🎜시스템의 모든 권한을 키/값 형식으로 기록할 수 있습니다. 키는 정수입니다. 값은 권한 이름을 나타내는 문자열입니다. 🎜🎜🎜미들웨어 적용🎜🎜🎜마지막으로 위의 미들웨어를 실제로 적용해야 합니다. config 디렉터리에서 middleware.php 파일을 열고 CheckAuth 미들웨어를 추가하세요. 🎜🎜
public function create()
{
    $this->middleware('check_auth');
    // ...
}
로그인 후 복사
🎜];🎜🎜 미들웨어의 적용 순서는 배열의 키 이름에 따라 앞에서 뒤로 실행됩니다. 배열 첨자를 통해 미들웨어의 실행 순서를 조정할 수 있습니다. 🎜🎜권한 제어가 필요한 컨트롤러나 메서드에서는 미들웨어 메서드를 사용하여 CheckAuth 미들웨어를 바인딩할 수 있습니다. 🎜🎜위 내용은 ThinkPHP6을 사용하여 사용자 역할 권한 관리를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
이전 기사:ThinkPHP6를 사용하여 우수한 프로젝트를 개발하는 방법을 단계별로 가르쳐드립니다. 다음 기사:로그인이 필요하지 않도록 ThinkPHP6을 사용하는 방법
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
최신 이슈
관련 주제
더>
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿