介绍
您好,亲爱的Khabrovchans。
在api平台上的工作过程中,我花费了大量时间寻找授权用户操作的正确方法。任务设置如下-创建一个相当广泛的访问控制和操作系统。
同时,它们中的大多数处于常规CRUD上,但其他控制器操作将需要授权。
因此,有必要创建一个简单而又有效且灵活的系统。有很多问题,因为我决定在这些文章中展示我所做工作的简化版本。
我想单独添加-这些材料是为练习程序员而设计的,对于初学者来说很难理解。本文不会安排项目的安装以及用于连接数据库的设置。您可以在Internet上轻松找到所有这些。
第1部分。模型,控制器
因此,任务是:有许多模型,在项目开发过程中,模型的数量可以增加或减少。
每个角色的动作均应按角色授权。
有一些简单的操作,例如CRUD和其他操作(例如import,export)。
有必要简化开发人员的工作(对您所爱的人),以便为他们创建其他模型和方法。
本文提供了Api应用程序的示例,但是该解决方案不仅适用于此。
模型
Post. ( ) app.
app/Models Posts. ( , -).
. :
php artisan make:model Models/Post --api --migration
php artisan migrate
: , . , .
PostController CRUD
Controller.
ModelController Controller , , PostController.
PostController — import() export(Post $post).
, .
Laravel Illuminate\Foundation\Auth\Access\AuthorizesRequests.
App\Http\Controllers\Controller ModelController. Controller , .
authorizeResource($model).
, (Middleware) .
:
can:viewAny,App\Models\Post
can:view,post
can:update,post
, , — :
- viewAny view apiResource
- , — .
:
. resourceAbilityMap() .
<?php
protected function resourceAbilityMap()
{
return [
'index' => 'viewAny',
'show' => 'view',
'create' => 'create',
'store' => 'create',
'edit' => 'update',
'update' => 'update',
'destroy' => 'delete',
];
}
. Laravel . , . index() , show(Post $post) . resourceMethodsWithoutModels()
<?php
protected function resourceMethodsWithoutModels()
{
return ['index', 'create', 'store'];
}
(ModelController)
app/Http/Controllers ModelController. :
- $guardedMethods « » => « ».
(Policy) , , (Gate). .
- $methodsWithoutModels .
- getModelClass() .
.
- authorizeResource($this->getModelClass()) . ( (Route), )
- resourceAbilityMap() resourceMethodsWithoutModels() , , .
<?php
namespace App\Http\Controllers;
abstract class ModelController extends Controller
{
protected $guardedMethods = [];
protected $methodsWithoutModels = [];
protected abstract function getModelClass(): string;
public function __construct()
{
$this->authorizeResource($this->getModelClass());
}
protected function resourceAbilityMap()
{
$base = parent::resourceAbilityMap();
return array_merge($base, $this->guardedMethods);
}
protected function resourceMethodsWithoutModels()
{
$base = parent::resourceMethodsWithoutModels();
return array_merge($base, $this->methodsWithoutModels);
}
}
(PostController)
:
- getModelClass() .
- $methodsWithoutModels « » => « » . . , =. , , .
- $methodsWithoutModels , . import
- — , . — .
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends ModelController
{
protected $guardedMethods = [
'export' => 'export',
'import' => 'import',
];
protected $methodsWithoutModels = ['import'];
protected function getModelClass(): string
{
return Post::class;
}
public function index()
{ }
public function store(Request $request)
{ }
public function show(Post $post)
{ }
public function update(Request $request, Post $post)
{ }
public function destroy(Post $post)
{ }
public function import()
{ }
public function export(Post $post)
{ }
}
(Routes)
.
'routes/api.php' ( 'routes/web.php', ) .
, , .
— ( ) , Route::apiResource('posts', 'PostController'). Laravel. .
— 'auth:api'. , .
<?php
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
Route::group(['middleware' => ['auth:api']], static function () {
Route::post('posts/import', 'PostController@import')->name('posts.import');
Route::get('posts/{post}/export', 'PostController@export')->name('posts.export');
Route::apiResource('posts', 'PostController');
});
. :
php artisan route:list
— ( )
+-----------------------+---------------------------+-------------------------------+
|URI |Action |Middleware |
+-----------------------+---------------------------+-------------------------------+
|api/posts |...\PostController@index |...,can:viewAny,App\Models\Post|
|api/posts |...\PostController@store |...,can:create,App\Models\Post |
|api/posts/import |...\PostController@import |...,can:import,App\Models\Post |
|api/posts/{post} |...\PostController@show |...,can:view,post |
|api/posts/{post} |...\PostController@update |...,can:update,post |
| | api / posts / {post} | ... \ PostController @ destroy | ...,可以:删除,发布|
| api / posts / {post} / export | ... \ PostController @ export | ...,可以:导出,发布|
+ ----------------------- + ------------------------- -+ ------------------------------- +
下一步是配置链接“门(Gate)<->策略”。但是在第二部分中有更多关于它的内容。