Controller Authorization

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...
}

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar

Facebook