지속적인 비즈니스 발전으로 인해 많은 중소기업에서는 자체적인 사용자 유지 관리 시스템을 보유하고 있으며, 이에 대해 사용자 권한 관리는 중요한 부분입니다. 시스템의 민감한 정보를 보호하고 비즈니스의 정상적인 운영을 보장하려면 역할 권한 관리 메커니즘을 사용하여 다양한 역할의 사용자가 지정된 리소스 및 데이터에만 액세스할 수 있도록 해야 합니다.
이 기사에서는 ThinkPHP6 프레임워크를 예로 들어 사용자 역할 권한 관리를 구현하기 위해 제공되는 권한 제어 미들웨어 및 확장 패키지를 사용하는 방법을 소개합니다.
먼저 두 개의 데이터베이스 테이블을 정의해야 합니다. 하나는 시스템 역할 정보를 저장하는 데 사용되는 역할 테이블이고, 다른 하나는 시스템 권한 정보를 저장하는 데 사용되는 권한 테이블입니다.
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。
接下来,我们需要创建角色和权限的模型。在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';
}
由于一个用户可能拥有多个角色,一个角色也可能对应多个权限,所以我们需要创建一个角色和权限的关联表。在数据库中创建一个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
)
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;
protected $table = 'role'; public function permissions() { return $this->belongsToMany( Permission::class, 'role_permission', 'role_id', 'permission_id' ); }
namespace appmodel;
class 권한 확장 모델
{
protected $table = 'permission'; public function roles() { return $this->belongsToMany( Role::class, 'role_permission', 'permission_id', 'role_id' ); }
}
역할이 여러 개인 경우 역할은 여러 권한에 해당할 수도 있으므로 역할과 권한의 연결 테이블을 만들어야 합니다. 데이터베이스에 role_permission 테이블을 생성합니다.
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
),
role_id</code > (<code>role_id
), KEY permission_id
(permission_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='역할-권한 연관 테이블'
모델에서 역할과 권한의 다대다 관계 정의:
namespace appmodel;
{
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, '没有权限'); }
}
namespace appmodel;
use thinkModel;
class 권한 확장 모델
{1 => 'user.create', 2 => 'user.read', 3 => 'user.update', 4 => 'user.delete',
// ... 'check_auth' => appmiddlewareCheckAuth::class,
public function create() { $this->middleware('check_auth'); // ... }