Mặc định, App\Http\Controllers\Controller
class trong Laravel sử dụng AuthorizesRequests
trait. Trait này cung cấp authorize method, mà có thể được sử dụng để nhanh chóng cấp quyền cho một hành động và throw một AuthorizationException
nếu hành động không được cấp quyền.
authorize
method giống các phương thức cấp quyền khác như Gate::allows
và $user->can()
. Vì vậy, hãy sử dụng authorize method để nhanh chóng cấp quyền cho một request thực hiện cập nhật một Post
:
<?php
namespace App\Http\Controllers;
use App\Post;
use App\Http\Controllers\Controller;
class PostController extends Controller
{
/**
* Update the given post.
*
* @param int $id
* @return Response
*/
public function update($id)
{
$post = Post::findOrFail($id);
$this->authorize('update', $post);
// Update Post...
}
}
Nếu hành động được cấp quyền, controller
sẽ tiếp tục thực thi bình thường; tuy nhiên, nếu authorize method xác định rằng hành động không được cấp quyền, một AuthorizationException
sẽ tự động được throw cái mà sẽ sinh ra một HTTP response với 403 Not Authorized
status code. Như bạn có thể thấy, authorize method là cách thuận tiện, nhanh chóng để cấp quyền một hành động hoặc throw một exception
với duy nhất một dòng code.
AuthorizesRequests trait
cũng cung cấp authorizeForUser
method để cấp quyền một hành động cho một user
mà hiện tại chưa được xác thực:
$this->authorizeForUser($user, 'update', $post);
Tự Động Xác Định Policy Methods
Các method của một policy
sẽ tương ứng với các method trong controller
. Ví dụ, trong update
method trên, controller
method và policy
method cùng sử dụng chung tên: update
.
Vì lí do này, Laravel
cho phép bạn đơn giản truyền vào các đối số instance vào authorize method, và ability để cấp quyền sẽ tự động được xác định dựa trên tên của hàm gọi. Trong ví dụ này, khi authorize
được gọi từ controller update
method, update method
cũng sẽ được gọi trên PostPolicy
:
/**
* Update the given post.
*
* @param int $id
* @return Response
*/
public function update($id)
{
$post = Post::findOrFail($id);
$this->authorize($post);
// Update Post...
}