이것은 여러 역할이 있는 앱에서 사용할 수있는 권한 모듈입니다. 각 역할마다 약간 다른 기능이 있는 경우 사용할 수 있습니다. 이 모듈을 사용하면 각 역할에 대한 권한을 정의한 다음 현재 사용자가 특정 페이지에 액세스하거나 특정 작업을 수행할 수 있는 권한이 있는지 확인할 수 있습니다.
여기를 클릭하여 GitHub의 저장소를 확인하십시오.
composer require flightphp/permissions를 실행하면 됩니다!
composer require flightphp/permissions
먼저 권한을 설정해야하고, 앱에 권한이 무엇을 의미하는지 알려야합니다. 최종적으로 $Permissions->has(), ->can(), 또는 is()를 사용하여 권한을 확인할 수 있습니다. has()와 can()은 기능적으로 동일하지만 코드를 더 읽기 쉽게 만들기 위해 이름을 다르게 지었습니다.
$Permissions->has()
->can()
is()
has()
can()
앱에서 사용자가 로그인되어 있는지 확인하는 기능이있는 경우를 가정해 보겠습니다. 다음과 같이 권한 개체를 생성할 수 있습니다.
// index.php require 'vendor/autoload.php'; // 일부 코드 // 그런 다음 현재 사용자의 현재 역할을 알려주는 코드가 있을 것입니다. // 아마도 현재 역할을 가져오는 코드가 있을 것입니다. // 현재 역할을 정의하는 세션 변수에서 현재 역할을 가져오는 경우가 일반적일 것입니다. // 그렇게하면 누군가 로그인한 후가 아니면 'guest' 또는 'public' 역할이있을 것입니다. $current_role = 'admin'; // 권한 설정 $permission = new \flight\Permission($current_role); $permission->defineRule('loggedIn', function($current_role) { return $current_role !== 'guest'; }); // 이 개체를 Flight 어딘가에 지속적으로 저장하는 것이 좋습니다 Flight::set('permission', $permission);
그런 다음 컨트롤러 어딘가에 다음과 같은 것이있을 수 있습니다.
<?php // 일부 컨트롤러 class SomeController { public function someAction() { $permission = Flight::get('permission'); if ($permission->has('loggedIn')) { // 어떤 작업 수행 } else { // 다른 작업 수행 } } }
또한이를 사용하여 응용 프로그램에서 작업을 수행할 수 있는 권한이 있는지 추적할 수도 있습니다. 예를 들어, 소프트웨어에서 게시물 작성과 상호 작용할 수있는 방법이있는 경우 특정 작업을 수행할 수 있는지 확인할 수 있습니다.
$current_role = 'admin'; // 권한 설정 $permission = new \flight\Permission($current_role); $permission->defineRule('post', function($current_role) { if($current_role === 'admin') { $permissions = ['create', 'read', 'update', 'delete']; } else if($current_role === 'editor') { $permissions = ['create', 'read', 'update']; } else if($current_role === 'author') { $permissions = ['create', 'read']; } else if($current_role === 'contributor') { $permissions = ['create']; } else { $permissions = []; } return $permissions; }); Flight::set('permission', $permission);
그런 다음 컨트롤러 어딘가에...
class PostController { public function create() { $permission = Flight::get('permission'); if ($permission->can('post.create')) { // 어떤 작업 수행 } else { // 다른 작업 수행 } } }
권한을 정의하는 클로저에 의존성을 주입할 수 있습니다. 확인하려는 일부 토글, ID 또는 기타 데이터 지점이 있는 경우 유용합니다. Class->Method 유형 호출의 경우 메서드에서 인수를 정의해야합니다.
$Permission->defineRule('order', function(string $current_role, MyDependency $MyDependency = null) { // ... 코드 }); // 컨트롤러 파일에서 public function createOrder() { $MyDependency = Flight::myDependency(); $permission = Flight::get('permission'); if ($permission->can('order.create', $MyDependency)) { // 어떤 작업 수행 } else { // 다른 작업 수행 } }
namespace MyApp; class Permissions { public function order(string $current_role, MyDependency $MyDependency = null) { // ... 코드 } }
클래스를 사용하여 권한을 정의할 수도 있습니다. 많은 권한이있고 코드를 깔끔하게 유지하려는 경우 유용합니다. 다음과 같이 할 수 있습니다:
<?php // 부트스트랩 코드 $Permissions = new \flight\Permission($current_role); $Permissions->defineRule('order', 'MyApp\Permissions->order'); // myapp/Permissions.php namespace MyApp; class Permissions { public function order(string $current_role, int $user_id) { // 미리 설정한 것으로 가정합니다 /** @var \flight\database\PdoWrapper $db */ $db = Flight::db(); $allowed_permissions = [ 'read' ]; // 누구나 주문을 볼 수 있음 if($current_role === 'manager') { $allowed_permissions[] = 'create'; // 매니저는 주문을 만들 수 있음 } $some_special_toggle_from_db = $db->fetchField('SELECT some_special_toggle FROM settings WHERE id = ?', [ $user_id ]); if($some_special_toggle_from_db) { $allowed_permissions[] = 'update'; // 사용자가 특별 토글을 가지고있으면 주문을 업데이트 할 수 있음 } if($current_role === 'admin') { $allowed_permissions[] = 'delete'; // 관리자는 주문을 삭제 할 수 있음 } return $allowed_permissions; } }
멋진 부분은 클래스에 대해 모든 메서드를 권한에 매핑하는 바로 가기가 있으며 (캐시 가능함!!!), 이렇게하면 $Permissions->has('order.read') 또는 $Permissions->has('company.read')를 실행하여 작동됩니다. 이를 정의하는 것은 매우 어렵기 때문에 여기에 머무르십시오. 그냥 이렇게하면됩니다:
$Permissions->has('order.read')
$Permissions->has('company.read')
그룹화하려는 권한 클래스를 작성합니다.
class MyPermissions { public function order(string $current_role, int $order_id = 0): array { // 권한을 확인하는 코드 return $permissions_array; } public function company(string $current_role, int $company_id): array { // 권한을 확인하는 코드 return $permissions_array; } }
그런 다음이 라이브러리를 사용하여 권한을 발견할 수 있도록 합니다.
$Permissions = new \flight\Permission($current_role); $Permissions->defineRulesFromClassMethods(MyApp\Permissions::class); Flight::set('permissions', $Permissions);
마지막으로 코드베이스에서 사용자가 특정 권한을 수행할 수 있는지 확인하려면 권한을 호출하십시오.
class SomeController { public function createOrder() { if(Flight::get('permissions')->can('order.create') === false) { die('주문을 만들 수 없습니다. 죄송합니다!'); } } }
캐싱을 활성화하려면 간단한 wruczak/phpfilecache 라이브러리를 참조하십시오. 아래에 캐싱을 활성화하는 예제가 있습니다.
// 이 $app은 귀하의 코드의 일부일 수 있거나 // null을 전달하여 클래스 외부에서 가져올 수 있습니다. $app = Flight::app(); // 현재는이 파일 캐시를 사용합니다. 나중에 다른 캐시를 쉽게 추가할 수 있습니다. $Cache = new Wruczek\PhpFileCache\PhpFileCache; $Permissions = new \flight\Permission($current_role, $app, $Cache); $Permissions->defineRulesFromClassMethods(MyApp\Permissions::class, 3600); // 3600은 캐시로 저장되는 시간(초)입니다. 캐시를 사용하지 않으려면 이것을 뺍니다