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
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;
});
}
}
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";
}
}
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";
}
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;
}
});
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) {
//
});
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
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');
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');
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:
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();
}
}
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;
});
ở 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
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;
}
}
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)
{
//
}
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;
}
}
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)) {
//
}
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)) {
}
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');
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');
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
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
}
}
Ta lại lưu ý cho tới phương thức create
trong policy
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
}
}
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
Chú ý phương thức create
@can('create', Post::class)
@endcan
@cannot('create', Post::class)
@endcannot
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
Bình luận