Phân quyền (authorization) người dùng trên các website không còn xa lạ với chúng ta ở đây, việc xác thực trong Laravel cũng khá đơn giản với Laravel Authentication, chúng ta cũng có thể tận dụng các hệ thống khác như mạng xã hội để xác thực.

Laravel authorization

Laravel authorization middleware

Trong Laravel authorization middleware, thường hay dùng session guard hoặc token guard. Session guard duy trì trạng thái người dùng trong mỗi lần request bằng cookie. Token guard xác thực người dùng bằng cách kiểm tra token hợp lệ trong mỗi lần request.

Có 2 cách chính trong phân quyền, đó là Gates và Policies. Chúng ta sẽ tìm hiểu lần lượt 2 cách này.

Gate là các Closure được xác định nếu một người dùng được xác thực để thực hiện một hành động, nó được định nghĩa trong App\Providers\AuthServiceProvider sử dụng facade Gate.

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Gate::define('update-post', function ($user, $post) {
        return $user->id == $post->user_id;
    });
} Gate cũng có thể định nghĩa sử dụng dạng callback string giống như Controller:
/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Gate::define('update-post', 'PostPolicy@update');
}

Resource Gates Bạn có thể định nghĩa nhiều Gate sử dụng phương thức resource

Gate::resource('posts', 'PostPolicy');

Laravel authorization example

Policy là các class quản lý logic trong phân quyền liên quan đến một Model hoặc tài nguyên nào đó. Ví dụ, nếu ứng dụng của bạn là một blog, bạn có thể có một model Post và một policy là postpolicy để phân quyền các hành động người dùng như tạo hay cập nhật các bài viết. Một policy muốn sử dụng cần được đăng ký, AuthServiceProvider được đưa vào trong project Laravel chứa một thuộc tính policies để map Eloquent model với các policy tương ứng.

<?php

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
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 = [
        Post::class => PostPolicy::class,
    ];

    /**
     * Register any application authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
}
5/5 - (1 bình chọn)

Phân quyền người dùng với Laravel authorization

Lê Trương Tấn Lộc

Với hơn 3 năm kinh nghiệm PHP/CSS/JS/WORDPRESS, 5 năm kinh nghiệm trong quản trị website tư vấn giải pháp SEO từ khóa, Marketing tối ưu nhất cho doanh nghiệp.

Hiện đang là trưởng phòng kinh doanh tại Siêu Tốc Việt.

zalo
messenger
messenger