authorized là gì

Xin kính chào bạn bè , hội ngộ bạn bè nhập series Laravel và những điều thú vị lần này, bản thân tiếp tục share phần loài kiến thức Authorization. Như chúng ta biết đấy, ở bài bác trước bản thân đã và đang share mang lại chúng ta về phần loài kiến thức Authentication – tức là phần login/logout/register nhập khối hệ thống. Lấy một ví như khi tất cả chúng ta singin thành công xuất sắc nhưng mà admin lại mang lại tất cả chúng ta một trong những quyền chắc chắn. Ví dụ như user này còn có quyền edit – delete, user cơ lại chỉ mất quyền coi thôi nhưng mà ko được phép tắc thay cho dổi bất kể gì cả. Authorization sẽ xử lý vấn đè này mang lại tất cả chúng ta.

Bạn đang xem: authorized là gì

1. Gate

Như cũng ra mắt qua quýt phía trên là Authorization là việc điều khiển và tinh chỉnh việc được truy vấn của người tiêu dùng. Hay rằng một cơ hội dễ dàng nắm bắt rộng lớn cơ đó là phân quyền nhập khối hệ thống. Thường thông thường thì tất cả chúng ta thấy, nếu như thực hiện một trang web quy tế bào nhỏ chỉ mất 2 quyền này là admin và user thì tất cả chúng ta chỉ việc viết lách middleware là hoàn thành. Nhưng vì thế yêu cầu của khối hệ thống cần thiết phân quyền một cơ hội phức tạp rộng lớn nên Laravel sinh ra Authorization để tương hỗ tất cả chúng ta trong các việc phân quyền cơ. Có 2 cơ hội để authorize trong Laravel: Gates và Policies. trước hết tất cả chúng ta tiếp tục đi tìm kiếm hiểu về Gates trong Laravel

Define

Gate theo bản thân hiểu thì đa số sử dụng trong các việc tất cả chúng ta authorize (xác thực) những action riêng biệt lẻ. Ta tiếp tục khái niệm những rằng buộc nhập method boot của AuthServiceProvider và dùng facade Gate. Do là tất cả chúng ta xác thực coi người tiêu dùng này còn có được tạo hành vi hoặc truy vấn nhập trang này trang nọ nhập khối hệ thống của tất cả chúng ta hay là không nên đối số trước tiên nhập hàm rằng buộc tiếp tục là 1 trong những user instance, còn đối số loại nhị tiếp tục là 1 trong những instance không giống. Ví dụ như người tiêu dùng sẽ có được quyền thay cho thay đổi update comment của tôi chẳng hạn

<?php namespace App\Providers; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Auth; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Gate::define('edit-comment', function ($user, $commment) { return $user->id == $comment->user_id; }); } }
Code language: HTML, XML (xml)

Gate::define() sẽ khái niệm một ĐK thân thích người tiêu dùng và vấn đề commment, tức là nế như đó trả về true thì người tiêu dùng được phép tắc sửa comment và ngược lại thì ko được sửa.

Alows – Denies – ForUser


Và khiến cho phép tắc authorized thì nhập controller tất cả chúng ta tiếp tục sử dụng câu mệnh lệnh sau :

public function index() { $comment = Comment::findOrFail(1); // comment đem id = 1 đem user_id = 1 if (Gate::allows('edit-comment', $comment)) { echo "Ban teo quyen chinh sua comment"; } else { echo "Ban khong teo quyen chinh sua comment"; } }
Code language: PHP (php)

Trên chỉ là 1 trong những ví dụ minh họa mang lại việc coi chúng ta đem quyền sửa đổi comment ko. Các các bạn sẽ ko nên truyền nhập argument $user trước tiên nhập, Laravel tiếp tục tự động hóa truyền user đang được truy vấn khối hệ thống nhập vào Gate Closure. Gate::denies() ngược lại với Gate::allows().
Nếu mình muốn coi một người tiêu dùng ngẫu nhiên giành được xác thực nhằm tiến hành 1 action nhập khối hệ thống của chúng ta hay là không thì những chúng ta có thể sử dụng phương thức forUser trong Gate facade

if (Gate::forUser($user)->allows('edit-comment', $comment)) { echo "Người sử dụng này được phép tắc sửa đổi comment"; } if (Gate::forUser($user)->denies('edit-comment', $comment)) { echo "Người sử dụng này sẽ không được phép tắc sửa đổi comment"; }
Code language: PHP (php)

Before

Ở phiên bạn dạng Laravel 5.6 thì tất cả chúng ta đem thêm Gate::before() để tớ rất có thể cấp cho toàn bộ những quyền cho 1 người tiêu dùng nào là cơ trước lúc những authorization được kiểm tra. Thường thông thường thì cơ đó là người cai quản trị trang web đem toàn bộ những quyền nhập khối hệ thống.

Gate::before(function ($user, $ability) { if ($user->isSuperAdmin()) { return true; } });
Code language: PHP (php)

Và chúng ta có thể sử dụng Gate::after() để khái niệm 1 callback và để được thực thi đua sau từng trốn tránh đánh giá authorization. Tuy nhiên, những các bạn sẽ bất biến được sản phẩm của việc đánh giá phân quyền.

Gate::after(function ($user, $ability, $result, $arguments) { // });
Code language: PHP (php)

2. Policies

Policies là những class quản lý và vận hành logic nhập phân quyền tương quan cho tới Model hoặc khoáng sản nào là cơ. Ví dụ, chúng ta đem model Comment và một policy CommentPolicy nhằm phân quyền coi người tiêu dùng nào là sẽ tiến hành sửa đổi hoặc update comment của tôi.
Các chúng ta có thể dẫn đến Policy giản dị vày command line

php artisan make:policy CommentPolicy
Code language: CSS (css)

Câu mệnh lệnh bên trên tiếp tục sinh rời khỏi một policy trống rỗng , nếu như mình muốn sinh rời khỏi một CRUD policy thì tất cả chúng ta cần thiết tăng tham lam số --model=Comment khi thực thi đua câu mệnh lệnh artisan

php artisan make:policy CommentPolicy --model=Comment

Nhìn nom có vẻ như tương tự cơ hội tạo nên resource controller đúng không ạ chúng ta. Vì thế nhưng mà người tớ ví Gate và Policy như thể Route và Controller.Mình tiếp tục phân tích phần này rộng lớn nhé, khi tất cả chúng ta sử dụng

Gate::resource('comments', 'CommentPolicy');
Code language: PHP (php)

thì với công thức resource như thế thì nó sẽ bị khái niệm rời khỏi tay chân như sau:

Gate::define('comments.view', 'CommentPolicy@view'); Gate::define('comments.create', 'CommentPolicy@create'); Gate::define('comments.update', 'CommentPolicy@update'); Gate::define('comments.delete', 'CommentPolicy@delete');
Code language: PHP (php)

Register Policy

Tiếp theo gót nhằm ĐK 1 policy thì tớ tiếp tục ĐK nhập file AuthServiceProvider.php. Đăng ký một policy tiếp tục hướng dẫn mang lại Laravel biết policy nào là sẽ tiến hành dùng nhằm phân quyền hành vi mang lại model nào:

<?php namespace App\Providers; use App\Comment; use App\Policies\CommentPolicy; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ Comment::class => CommentPolicy::class, ]; /** * Register any application authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); } }
Code language: HTML, XML (xml)

Writing Policy

Nếu bên trên tôi đã nói Gate nó dùng làm authorize những hành vi riêng biệt lẻ. Bây giờ viết lách nhập Policy cũng ko không giống gì cả nhé, thay cho viết

Gate::define('edit-comment', function ($user, $commment) { return $user->id == $comment->user_id; });
Code language: PHP (php)

ở nhập function boot() bây giờ tất cả chúng ta tiếp tục viết lách nhập policy như sau

<?php namespace App\Policies; use App\User; use App\Comment; class PostPolicy { /** * Determine if the given post can be updated by the user. * @return bool */ public function update(User $user, Comment $comment) { return $user->id === $comment->user_id; } }
Code language: HTML, XML (xml)

Các chúng ta lưu ý phương thức create trong policy chỉ nhận đối số trước tiên là Model user chú không sở hữu và nhận tăng đối số loại nhị.

Xem thêm: phát biểu nào dưới đây là đúng

public function create(User $user) { // }
Code language: PHP (php)

Policy Filters

Đôi với cùng 1 người tiêu dùng chắc chắn nhập khối hệ thống nếu như như admin, người cơ đem toàn bộ những quyền nhưng mà ko cần thiết trải qua quýt những authorize riêng biệt lẻ. Vì vậy tất cả chúng ta tiếp tục khái niệm một phương thức before trong policy. Phương thức này tiếp tục thực thi đua trước ngẫu nhiên công thức nào là nhập policy.

public function before($user, $ability) { if ($user->isAdmin()) { return true; } }
Code language: PHP (php)

Nếu mình muốn một user ko được phép tắc tiến hành ngẫu nhiên gì chúng ta chỉ việc trả về false nhập phương thức before. Nếu độ quý hiếm được trả về là null, việc cấp cho quyền sẽ tiến hành kế tiếp ra mắt nhập công thức policy.

Authorizing Actions Using Policy


Rồi tiếp sau nhằm tiến hành hành vi authorize dùng Policy ra sao? Thì tất cả chúng ta tiếp tục trải qua 2 phương thức can và cant được tạo nên sẵn nhập Model User. Phương thức can nhận hành vi mình muốn cho phép và model tương quan và ngược lại là phương thức cant.

if ($user->can('update', $comment)) { // }
Code language: PHP (php)

Các chúng ta lưu ý , function create trong policy ko đòi hỏi thông số thứ hai là instance của model nào là. Trong tình huống này, tất cả chúng ta rất có thể pass thương hiệu class nhập phương thức can. Tên lớp sẽ tiến hành dùng nhằm xác lập Policy nào là tiếp tục dùng khi authorize

use App\Comment; if ($user->can('create', Comment::class)) { }
Code language: PHP (php)

Via Middleware

Laravel thêm 1 middleware rất có thể authorize action trước lúc đem request gửi cho tới trong cả cho tới với routes hoặc controller. Mặc quyết định, middleware Illuminate\Auth\Middleware\Authorize được gán key can trong class App\Http\Kernel

use App\Post; Route::put('/post/{post}', function (Post $post) { // The current user may update the post... })->middleware('can:update,post');
Code language: PHP (php)

Chú ý, vấn là phương thức create không require thông số loại nhị. Trong tình huống này tất cả chúng ta tiếp tục pass thương hiệu class nhập middleware. Tên class tiếp tục ra quyết định policy nào là nhằm dùng khi authorize hành vi.

Route::post('/post', function () { })->middleware('can:create,App\Post');
Code language: PHP (php)

Via Controller Helpers

Như tớ đang được biết, ngoài phương thức can ra thì Laravel còn tương hỗ phương thức authorize do controller thao tác của tất cả chúng ta thừa kế từ App\Http\Controlers\Controller

<?php namespace App\Http\Controllers; use App\Comment; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class CommentController extends Controller { * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update(Request $request, Comment $comment) { $this->authorize('update', $comment); // Người sử dụng rất có thể update commmet của mình } }
Code language: HTML, XML (xml)

Ta lại lưu ý cho tới phương thức create trong policy

<?php namespace App\Http\Controllers; use App\Comment; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class CommentController extends Controller { * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update(Request $request) { $this->authorize('create', Comment::class); // Người sử dụng rất có thể create commnet của mình } }
Code language: HTML, XML (xml)

Via Blade Template

Khi viết lách Blade template, chúng ta chỉ ham muốn những người tiêu dùng chỉ rất có thể coi được những hành vi nhưng mà người tiêu dùng đem quyền truy vấn thì tất cả chúng ta tiếp tục sử dụng @can và @cannot.

@can('update', $post) // hiển thị button edit @endcan @cannot('update', $post) // Khong hiển thị button edit @endcannot
Code language: PHP (php)

Chú ý phương thức create

@can('create', Post::class) @endcan @cannot('create', Post::class) @endcannot
Code language: CSS (css)

3. Compare Authentication – Authorization

Từ những lần hiểu của tôi phía trên thì bản thân rút rời khỏi được vài ba điều về việc không giống nhau thân thích Authentication và Authorization như sau. ak nói đến điểm tương tự nhau trước. Chúng đều được cho phép người tiêu dùng đem hoặc ko thực thi đua một hành vi nhập hệ thống(cả 2 đều dùng được middleware).

Còn sự không giống nhau là chúng ta cứ tưởng tượng khi chúng ta vào trong 1 căn nhà, nếu như bạn là mái ấm của căn nhà cơ thì nên đem khóa xe nhằm xuất hiện cổng rời khỏi nhằm nhập nhà(Authentication). Còn nhập được nhập ngồi trong nhà rồi, đem những chống thì nếu như mình muốn nhập phòng nghỉ của cha mẹ thì chúng ta nên được sự đồng ý của cha mẹ. Có những chống chúng ta được nhập , đem những chống chúng ta ko được phép tắc vào(Authorization).

4. Kết luận

Qua tuy nhiên loại bản thân lần hiểu và share bên trên, mong chờ phần nào là chúng ta cũng nắm rõ về những định nghĩa về Gate hay Policy , và cơ hội bọn chúng sinh hoạt rời khỏi sao. Cảm ơn chúng ta đang được hiểu những loại share của tôi.

Các chúng ta có thể xem thêm những nội dung bài viết hoặc về Laravel tại đây.

  • THAM KHẢO TÀI LIỆU LẬP TRÌNH TỪ CƠ BẢN ĐẾN NÂNG CAO

Hãy nhập cuộc nhóm Học lập trình để thảo luận tăng về những yếu tố nằm trong quan hoài.

Tham khảo: Viblo

Xem thêm: đắp mặt nạ xong có rửa mặt không