Laravel 8 gói vai trò và quyền

Bởi vì tất cả các quyền sẽ được đăng ký trên cổng của Laravel, bạn có thể kiểm tra xem người dùng có quyền hay không bằng hàm can mặc định của Laravel

$user->can['edit articles'];

hỗ trợ chúng tôi

Chúng tôi đầu tư rất nhiều tài nguyên vào việc tạo ra các gói nguồn mở tốt nhất trong lớp. Bạn có thể hỗ trợ chúng tôi bằng cách mua một trong những sản phẩm trả phí của chúng tôi

Chúng tôi đánh giá cao việc bạn gửi cho chúng tôi một tấm bưu thiếp từ quê hương của bạn, đề cập đến [những] gói bạn đang sử dụng của chúng tôi. Bạn sẽ tìm thấy địa chỉ của chúng tôi trên trang liên hệ của chúng tôi. Chúng tôi xuất bản tất cả các bưu thiếp nhận được trên bức tường bưu thiếp ảo của chúng tôi

thử nghiệm

composer test

Nhật ký thay đổi

Vui lòng xem CHANGELOG để biết thêm thông tin về những thay đổi gần đây

Đóng góp

Vui lòng xem ĐÓNG GÓP để biết chi tiết

Bảo vệ

Nếu bạn phát hiện ra bất kỳ vấn đề nào liên quan đến bảo mật, vui lòng gửi email tới security@spatie. thay vì sử dụng trình theo dõi vấn đề

Bưu thiếp

Bạn được tự do sử dụng gói này, nhưng nếu nó được sử dụng trong môi trường sản xuất của bạn, chúng tôi đánh giá cao việc bạn gửi cho chúng tôi một tấm bưu thiếp từ quê hương của bạn, đề cập đến [những] gói nào bạn đang sử dụng

Địa chỉ của chúng tôi là. Spatie, Kruikstraat 22, 2018 Antwerp, Bỉ

Chúng tôi xuất bản tất cả các bưu thiếp nhận được trên trang web của công ty chúng tôi

Tín dụng

  • Chris Brown
  • Freek Van der Herten
  • Tất cả những người đóng góp

Gói này chủ yếu dựa trên các bài học Laracasts tuyệt vời của Jeffrey Way về quyền và vai trò. Mã ban đầu của anh ấy có thể được tìm thấy trong repo này trên GitHub

Đặc biệt cảm ơn Alex Vanderbist, người đã giúp đỡ rất nhiều với v2 và Chris Brown vì sự hỗ trợ lâu năm của anh ấy giúp chúng tôi duy trì gói hàng

Trong hướng dẫn này, chúng ta sẽ thấy laravel 8 vai trò và quyền của người dùng mà không cần gói. Vai trò và quyền là một phần quan trọng của nhiều trang web

Trong ví dụ về vai trò và quyền của người dùng laravel 8 này, chúng tôi không sử dụng bất kỳ loại gói nào như spatie/laravel-permission cho quyền của vai trò người dùng trong laravel. Nhưng bạn có thể sử dụng spatie/laravel-permission để tạo hướng dẫn về vai trò và quyền của người dùng trong laravel 8

Trong ví dụ này, bạn có thể cấp vai trò cho người dùng cụ thể và quyền truy cập vào tác vụ cụ thể. Trong hướng dẫn này, chúng tôi sẽ triển khai hướng dẫn về vai trò và quyền của người dùng trong laravel 8 từ đầu

Trong thế giới phát triển web, bạn sẽ thường bắt gặp các thuật ngữ "vai trò" và "quyền", nhưng những điều này có nghĩa là gì? . Một vai trò chỉ là một tập hợp các quyền

Để cung cấp cho điều này một chút ngữ cảnh, hãy lấy một ví dụ đơn giản về hệ thống quản lý nội dung [CMS]. Hệ thống có thể có nhiều quyền cơ bản, bao gồm các quyền sau

  • Có thể tạo bài đăng trên blog
  • Có thể cập nhật bài viết trên blog
  • Có thể xóa bài đăng trên blog
  • Có thể tạo người dùng
  • Có thể cập nhật người dùng
  • Có thể xóa người dùng

Hệ thống cũng có thể có các vai trò, chẳng hạn như sau

  • biên tập viên
  • Quản trị viên

Vì vậy, chúng tôi có thể cho rằng vai trò 'Biên tập viên' sẽ có quyền 'có thể tạo bài đăng trên blog', 'có thể cập nhật bài đăng trên blog' và 'có thể xóa bài đăng trên blog'. Tuy nhiên, họ sẽ không có quyền tạo, cập nhật hoặc xóa người dùng, trong khi quản trị viên sẽ có tất cả các quyền này

Sử dụng các vai trò và quyền như được liệt kê ở trên là một cách tuyệt vời để xây dựng một hệ thống có khả năng giới hạn những gì người dùng có thể xem và làm

Cách sử dụng Gói quyền Spatie Laravel

Có nhiều cách khác nhau để triển khai vai trò và quyền trong ứng dụng Laravel của bạn. Bạn có thể tự viết mã để xử lý toàn bộ khái niệm. Tuy nhiên, điều này đôi khi có thể rất tốn thời gian và trong hầu hết các trường hợp, sử dụng gói là quá đủ

Trong bài viết này, chúng ta sẽ sử dụng gói Laravel Permission từ Spatie

Cài đặt và cấu hình

Để bắt đầu sử dụng gói, chúng tôi sẽ cài đặt gói bằng lệnh sau

composer require spatie/laravel-permission

Bây giờ chúng tôi đã cài đặt gói, chúng tôi sẽ cần xuất bản tệp cấu hình và di chuyển cơ sở dữ liệu

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

Bây giờ chúng ta có thể chạy di chuyển để tạo các bảng mới trong cơ sở dữ liệu của mình

php artisan migrate

Giả sử rằng chúng tôi đang sử dụng các giá trị cấu hình mặc định và không thay đổi bất cứ điều gì trong gói

php artisan migrate
6, bây giờ chúng tôi sẽ có năm bảng mới trong cơ sở dữ liệu của mình

  1. php artisan migrate
    
    7 - Bảng này sẽ chứa tên của các vai trò trong ứng dụng của bạn
  2. php artisan migrate
    
    8 - Bảng này sẽ chứa tên của các quyền trong ứng dụng của bạn
  3. php artisan migrate
    
    9 - Bảng này sẽ chứa dữ liệu cho biết các quyền mà mô hình của bạn [e. g. ,
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Spatie\Permission\Traits\HasRoles;
    
    class User extends Authenticatable
    {
        use HasRoles;
    
        // ...
    }
    
    0] có
  4. use Illuminate\Foundation\Auth\User as Authenticatable;
    use Spatie\Permission\Traits\HasRoles;
    
    class User extends Authenticatable
    {
        use HasRoles;
    
        // ...
    }
    
    1 - Bảng này sẽ chứa dữ liệu cho biết vai trò nào mà người mẫu của bạn [e. g. ,
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Spatie\Permission\Traits\HasRoles;
    
    class User extends Authenticatable
    {
        use HasRoles;
    
        // ...
    }
    
    0] có
  5. use Illuminate\Foundation\Auth\User as Authenticatable;
    use Spatie\Permission\Traits\HasRoles;
    
    class User extends Authenticatable
    {
        use HasRoles;
    
        // ...
    }
    
    3 - Bảng này sẽ chứa dữ liệu hiển thị các quyền mà mỗi vai trò có

Để hoàn tất quá trình cài đặt cơ bản, bây giờ chúng ta có thể thêm đặc điểm

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
4 vào mô hình của mình

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}

Tạo vai trò và quyền

Để bắt đầu với việc thêm vai trò và quyền vào ứng dụng Laravel của mình, trước tiên chúng ta cần lưu trữ chúng trong cơ sở dữ liệu. Thật đơn giản để tạo một vai trò hoặc quyền mới bởi vì trong gói của Spatie, chúng chỉ là những mô hình.

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
5 và
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
6

Vì vậy, điều này có nghĩa là nếu chúng tôi muốn tạo một vai trò mới trong hệ thống của mình, chúng tôi có thể làm như sau

$role = Role::create[['name' => 'editor']];

Chúng ta có thể tạo quyền theo cách tương tự

$permission = Permission::create[['name' => 'create-blog-posts']];

Trong hầu hết các trường hợp, bạn sẽ xác định các quyền trong mã của mình thay vì để người dùng ứng dụng của bạn tạo chúng. Tuy nhiên, bạn có thể sẽ có cách tiếp cận hơi khác với các vai trò. Bạn có thể muốn tự xác định tất cả các vai trò trong cơ sở mã của mình và không cung cấp cho người dùng bất kỳ khả năng nào để tạo vai trò mới. Mặt khác, bạn có thể tự tạo một số vai trò "người gieo hạt" [e. g. , Quản trị viên] và sau đó cung cấp cho người dùng của bạn chức năng thêm những cái mới. Quyết định này chủ yếu phụ thuộc vào những gì bạn đang cố gắng đạt được với hệ thống của mình và người dùng cuối là ai

Nếu bạn muốn thêm bất kỳ vai trò và quyền mặc định nào vào ứng dụng của mình, bạn có thể thêm chúng bằng trình tạo cơ sở dữ liệu. Có thể bạn sẽ muốn tạo một seeder dành riêng cho tác vụ này [có thể được gọi là

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
7]. Vì vậy, hãy bắt đầu bằng cách tạo seeder mới bằng cách sử dụng lệnh sau

php artisan make:seeder RoleAndPermissionSeeder

Điều này đáng lẽ phải tạo một tệp

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
8 mới. Trước khi chúng tôi thực hiện bất kỳ thay đổi nào đối với tệp này, chúng tôi cần nhớ cập nhật
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
9 để nó tự động gọi tệp hạt giống mới của chúng tôi bất cứ khi nào chúng tôi sử dụng lệnh
$role = Role::create[['name' => 'editor']];
0

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run[]
    {
        // ...

        $this->call[[
            RoleAndPermissionSeeder::class,
        ]];

        // ...
    }
}

Bây giờ, chúng ta có thể cập nhật seeder mới để thêm một số vai trò và quyền mặc định vào hệ thống của chúng ta

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class RoleAndPermissionSeeder extends Seeder
{
    public function run[]
    {
        Permission::create[['name' => 'create-users']];
        Permission::create[['name' => 'edit-users']];
        Permission::create[['name' => 'delete-users']];

        Permission::create[['name' => 'create-blog-posts']];
        Permission::create[['name' => 'edit-blog-posts']];
        Permission::create[['name' => 'delete-blog-posts']];

        $adminRole = Role::create[['name' => 'Admin']];
        $editorRole = Role::create[['name' => 'Editor']];

        $adminRole->givePermissionTo[[
            'create-users',
            'edit-users',
            'delete-users',
            'create-blog-posts',
            'edit-blog-posts',
            'delete-blog-posts',
        ]];

        $editorRole->givePermissionTo[[
            'create-blog-posts',
            'edit-blog-posts',
            'delete-blog-posts',
        ]];
    }
}

Gán vai trò và quyền cho người dùng

Bây giờ chúng ta đã có vai trò và quyền trong cơ sở dữ liệu của mình và sẵn sàng để được chỉ định, chúng ta có thể xem cách chúng ta có thể chỉ định chúng cho người dùng của mình

Trước tiên, hãy xem việc gán vai trò mới cho người dùng đơn giản như thế nào

$user = User::first[];

$user->assignRole['Admin'];

Chúng tôi cũng có thể cấp quyền cho vai trò đó để người dùng cũng sẽ có quyền đó

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
0

Có thể là bạn có thể cung cấp chức năng trong ứng dụng của mình để cấp quyền trực tiếp cho người dùng, cũng như [hoặc thay vì] chỉ định vai trò cho họ. Đoạn mã dưới đây cho thấy cách chúng ta có thể làm điều này

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
1

Cùng với việc có thể chỉ định vai trò và quyền, bạn sẽ cần cung cấp chức năng xóa vai trò và thu hồi quyền của người dùng. Dưới đây là tổng quan nhanh về việc xóa vai trò khỏi người dùng dễ dàng như thế nào

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
2

Chúng tôi cũng có thể xóa quyền khỏi người dùng và vai trò theo cách tương tự

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
3

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
4

Hạn chế quyền truy cập dựa trên quyền

Bây giờ chúng ta đã có vai trò và quyền được lưu trữ trong cơ sở dữ liệu của mình và biết cách gán chúng cho người dùng của mình, chúng ta có thể xem cách thêm kiểm tra ủy quyền

Cách đầu tiên mà bạn có thể muốn thêm ủy quyền là sử dụng phần mềm trung gian

$role = Role::create[['name' => 'editor']];
1. Điều này được mặc định trong các bản cài đặt Laravel mới, vì vậy miễn là bạn chưa xóa nó khỏi
$role = Role::create[['name' => 'editor']];
2 của mình, thì nó sẽ được đặt bí danh thành
$role = Role::create[['name' => 'editor']];
3. Vì vậy, hãy tưởng tượng rằng chúng ta có một tuyến đường mà chúng ta muốn hạn chế quyền truy cập trừ khi người dùng được xác thực có phần mềm trung gian
$role = Role::create[['name' => 'editor']];
4. Chúng tôi có thể thêm phần mềm trung gian vào tuyến đường riêng lẻ

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
5

Bạn có thể thấy rằng bạn có nhiều tuyến đường có liên quan đến nhau và dựa trên cùng một quyền. Trong trường hợp này, tệp tuyến đường của bạn có thể hơi lộn xộn do chỉ định phần mềm trung gian trên cơ sở từng tuyến đường. Vì vậy, thay vào đó, bạn có thể thêm ủy quyền bằng cách thêm phần mềm trung gian vào nhóm tuyến đường

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
6

Điều đáng chú ý là nếu bạn muốn xác định phần mềm trung gian của mình trong các hàm tạo của bộ điều khiển, bạn cũng có thể sử dụng phần mềm trung gian

$role = Role::create[['name' => 'editor']];
3 ở đó. Bạn cũng có thể muốn sử dụng
$role = Role::create[['name' => 'editor']];
6 trong các phương pháp điều khiển của mình để sử dụng phần mềm trung gian. Sử dụng phương pháp này sẽ yêu cầu bạn tạo cho các mô hình của mình, nhưng nếu được sử dụng đúng cách, kỹ thuật này có thể thực sự hữu ích để giữ cho ủy quyền của bạn rõ ràng và dễ hiểu

Bạn có thể thấy trong ứng dụng của mình rằng đôi khi bạn cần kiểm tra thủ công xem người dùng có quyền cụ thể hay không nhưng không từ chối hoàn toàn quyền truy cập. Chúng ta có thể làm điều này bằng cách sử dụng phương pháp

$role = Role::create[['name' => 'editor']];
7 trên mô hình
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
0

Ví dụ: hãy tưởng tượng rằng chúng tôi có một biểu mẫu trong ứng dụng của mình cho phép người dùng cập nhật tên, địa chỉ email và mật khẩu của họ. Bây giờ, giả sử rằng chúng tôi muốn cấp cho người dùng có vai trò 'Trình chỉnh sửa' quyền chỉnh sửa người dùng nhưng không được thay đổi mật khẩu của người dùng khác. Chúng tôi sẽ chỉ cho phép người dùng cập nhật mật khẩu của người dùng khác nếu họ cũng có quyền

$role = Role::create[['name' => 'editor']];
9

Trong ví dụ bên dưới, chúng tôi sẽ giả định rằng chúng tôi đang sử dụng phần mềm trung gian để chỉ cho phép người dùng có quyền

$permission = Permission::create[['name' => 'create-blog-posts']];
0 truy cập vào phương pháp này. Hãy xem cách chúng ta có thể triển khai điều này trong bộ điều khiển của mình

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
7

Hiển thị và ẩn nội dung trong chế độ xem dựa trên quyền

Có khả năng là bạn sẽ muốn có thể hiển thị và ẩn các phần trong chế độ xem của mình dựa trên quyền của người dùng. Ví dụ: hãy tưởng tượng rằng chúng ta có một nút cơ bản trong chế độ xem Blade mà chúng ta có thể nhấn để xóa người dùng. Cũng giả sử rằng nút chỉ được hiển thị nếu người dùng có quyền

$permission = Permission::create[['name' => 'create-blog-posts']];
1

Để hiện và ẩn nút này, cực kỳ đơn giản. Chúng ta có thể sử dụng chỉ thị _______18_______2 Blade

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
8

Nếu người dùng có quyền

$permission = Permission::create[['name' => 'create-blog-posts']];
1, mọi thứ bên trong
$permission = Permission::create[['name' => 'create-blog-posts']];
2 và
$permission = Permission::create[['name' => 'create-blog-posts']];
5 sẽ được hiển thị. Nếu không, nó sẽ không được hiển thị trong chế độ xem Blade dưới dạng HTML

Điều quan trọng cần nhớ là việc ẩn các nút, biểu mẫu và liên kết trong chế độ xem của bạn không cung cấp bất kỳ ủy quyền nào từ phía máy chủ. Bạn vẫn cần thêm quyền vào mã phụ trợ của mình [e. g. , trong bộ điều khiển của bạn hoặc sử dụng phần mềm trung gian như đã giải thích ở trên] để ngăn người dùng độc hại thực hiện bất kỳ yêu cầu nào đối với các tuyến đường chỉ dành cho người dùng có quyền cụ thể

Cách thêm quyền "Quản trị viên cấp cao"

Khi bạn tạo một ứng dụng, bạn có thể muốn thêm vai trò "quản trị viên cấp cao". Một ví dụ hoàn hảo cho điều này có thể là bạn cung cấp nền tảng phần mềm dưới dạng dịch vụ [SaaS] cho nhiều bên thuê. Bạn có thể muốn nhân viên của công ty mình có thể di chuyển xung quanh toàn bộ ứng dụng và xem các hệ thống của các đối tượng thuê khác nhau [có thể để gỡ lỗi và trả lời phiếu hỗ trợ]

Trước khi chúng tôi thêm kiểm tra quản trị viên cấp cao, có lẽ nên xem nhanh cách gói của Spatie sử dụng trong Laravel. Trong trường hợp bạn chưa bắt gặp chúng, các cổng thực sự đơn giản;

Khi bạn sử dụng một đoạn mã như

$permission = Permission::create[['name' => 'create-blog-posts']];
6, bạn đang sử dụng cổng của Laravel

Trước khi bất kỳ cổng nào được chạy để kiểm tra quyền, chúng tôi có thể chạy mã mà chúng tôi xác định theo phương thức

$permission = Permission::create[['name' => 'create-blog-posts']];
7. Nếu bất kỳ lần đóng
$permission = Permission::create[['name' => 'create-blog-posts']];
7 nào đang chạy trả về
$permission = Permission::create[['name' => 'create-blog-posts']];
9, thì người dùng được phép truy cập. Nếu một đóng cửa
$permission = Permission::create[['name' => 'create-blog-posts']];
7 trả về false, nó sẽ từ chối quyền truy cập. Nếu nó trả về
php artisan make:seeder RoleAndPermissionSeeder
1, Laravel sẽ tiếp tục và chạy bất kỳ lần đóng
$permission = Permission::create[['name' => 'create-blog-posts']];
7 nào còn tồn đọng và sau đó tự kiểm tra cổng

Trong lớp

php artisan make:seeder RoleAndPermissionSeeder
3 trong gói, chúng tôi có thể thấy rằng kiểm tra quyền của chúng tôi được thêm vào dưới dạng
$permission = Permission::create[['name' => 'create-blog-posts']];
7 để chạy trước cổng. Nếu gói xác định rằng người dùng có quyền [được chỉ định trực tiếp hoặc thông qua vai trò], gói sẽ trả về
$permission = Permission::create[['name' => 'create-blog-posts']];
9. Nếu không, nó sẽ trả về
php artisan make:seeder RoleAndPermissionSeeder
1 để có thể chạy bất kỳ lần đóng
$permission = Permission::create[['name' => 'create-blog-posts']];
7 nào khác

Vì vậy, chúng ta có thể sử dụng phương pháp tương tự này để thêm kiểm tra vai trò quản trị viên cấp cao vào mã của mình. Chúng tôi có thể thêm mã vào

php artisan make:seeder RoleAndPermissionSeeder
8 của chúng tôi

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
9

Bây giờ, bất cứ khi nào chúng tôi chạy một dòng mã như

$permission = Permission::create[['name' => 'create-blog-posts']];
6, chúng tôi sẽ kiểm tra xem người dùng có quyền
$permission = Permission::create[['name' => 'create-blog-posts']];
1 hoặc vai trò
namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run[]
    {
        // ...

        $this->call[[
            RoleAndPermissionSeeder::class,
        ]];

        // ...
    }
}
1 hay không. Nếu ít nhất một trong hai tiêu chí được thỏa mãn, người dùng sẽ được phép truy cập. Nếu không, người dùng sẽ bị từ chối truy cập

Cách kiểm tra quyền và quyền truy cập

Có một bộ kiểm tra tự động bao gồm ủy quyền của bạn có thể cực kỳ tiện dụng. Nó giúp mang lại cho bạn sự tự tin rằng bạn đang bảo vệ các tuyến đường của mình đúng cách và chỉ những người dùng có quyền phù hợp mới có thể truy cập một số tính năng nhất định

Để xem làm thế nào chúng ta có thể viết một bài kiểm tra cho điều này, chúng ta sẽ bắt đầu bằng cách tưởng tượng một hệ thống đơn giản mà chúng ta có thể viết bài kiểm tra cho. Các bài kiểm tra sẽ chỉ ở mức siêu cơ bản và chắc chắn có thể nghiêm ngặt hơn, nhưng hy vọng nó sẽ cung cấp cho bạn ý tưởng về khái niệm cơ bản về kiểm tra quyền

Giả sử chúng ta có một CMS có hai vai trò mặc định. 'Quản trị viên' và 'Biên tập viên'. Chúng tôi cũng sẽ cho rằng hệ thống của chúng tôi không cho phép gán quyền trực tiếp cho người dùng. Thay vào đó, các quyền chỉ có thể được gán cho các vai trò và sau đó người dùng có thể được chỉ định một trong số các vai trò đó

Giả sử rằng theo mặc định, vai trò 'Quản trị viên' có quyền tạo/cập nhật/xóa người dùng và tạo/cập nhật/xóa các bài đăng trên blog. Giả sử rằng vai trò 'Biên tập viên' chỉ có quyền tạo/cập nhật/xóa các bài đăng trên blog

Bây giờ, hãy lấy ví dụ cơ bản về lộ trình và bộ điều khiển mà chúng ta có thể thực hiện để tạo người dùng mới

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
5

php artisan migrate
1

Như bạn có thể thấy, chúng tôi đã thêm quyền cho tuyến đường để chỉ những người dùng có quyền

$role = Role::create[['name' => 'editor']];
4 mới được phép truy cập

Bây giờ, chúng ta có thể viết các bài kiểm tra của mình

php artisan migrate
2

Mẹo thưởng

Nếu bạn sẽ tự tạo quyền và không cho phép người dùng của mình tạo quyền, thì việc lưu tên quyền và tên vai trò của bạn dưới dạng hằng số hoặc enum có thể khá hữu ích. Ví dụ: để xác định tên quyền của bạn, bạn có thể có một tệp như thế này

php artisan migrate
3

Bằng cách sử dụng một tệp như thế này, bạn có thể dễ dàng tránh mọi lỗi chính tả có thể gây ra bất kỳ lỗi không mong muốn nào. Ví dụ: hãy tưởng tượng rằng chúng tôi có quyền được gọi là

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run[]
    {
        // ...

        $this->call[[
            RoleAndPermissionSeeder::class,
        ]];

        // ...
    }
}
3 và chúng tôi có dòng mã này

php artisan migrate
4

Nếu bạn đang xem xét mã này trong một yêu cầu kéo hoặc tự viết mã đó, tôi sẽ không trách bạn vì nghĩ rằng nó hợp lệ. Tuy nhiên, chúng tôi đã bỏ qua

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run[]
    {
        // ...

        $this->call[[
            RoleAndPermissionSeeder::class,
        ]];

        // ...
    }
}
4 ở cuối giấy phép. Vì vậy, để tránh vấn đề này, chúng ta có thể sử dụng như sau

php artisan migrate
5

Bây giờ, chúng tôi có thêm niềm tin rằng tên quyền là chính xác. Như một phần thưởng bổ sung, điều này cũng giúp bạn cực kỳ dễ dàng nếu bạn muốn xem bất kỳ nơi nào sử dụng quyền này, bởi vì IDE [e. g. , PHPStorm] sẽ có thể phát hiện tệp nào đang được sử dụng trong

Các gói và phương pháp thay thế

Ngoài việc sử dụng gói Cấp phép Laravel của Spatie, còn có các gói khác có thể được sử dụng để thêm vai trò và quyền cho ứng dụng của bạn. Ví dụ: bạn có thể sử dụng Bouncer hoặc Laratrust

Bạn có thể thấy rằng bạn cần nhiều chức năng riêng biệt và tính linh hoạt trong một số ứng dụng của mình hơn là các gói cung cấp. Trong trường hợp này, bạn có thể cần phải viết cách triển khai quyền và vai trò của riêng mình. Một điểm khởi đầu tốt cho việc này là sử dụng 'Cổng' và 'Chính sách' của Laravel, như đã đề cập trước đó

Phần kết luận

Hy vọng bài viết này đã cung cấp cho bạn một cái nhìn tổng quan về cách thêm quyền cho các ứng dụng Laravel của bạn bằng cách sử dụng gói Laravel Permission của Spatie. Nó cũng sẽ cung cấp cho bạn cái nhìn sâu sắc về cách có thể viết các bài kiểm tra tự động trong PHPUnit để kiểm tra xem các quyền của bạn có được thiết lập chính xác hay không

Làm cách nào để kiểm tra vai trò người dùng trong Laravel 8?

Bạn có thể xác định xem người dùng có vai trò nhất định hay không. $user->hasRole['writer']; // hoặc ít nhất một vai trò trong dãy vai trò. $user->hasRole[['editor', 'moderator']]; . $user->hasAnyRole[['writer', 'reader']];

Làm cách nào để thêm quyền trong Laravel 8?

Tạo vai trò và quyền . tạo [['tên' => 'biên tập viên']]; . $permission = Quyền. tạo[['tên' => 'tạo-bài-blog']];

Làm cách nào để sử dụng vai trò và quyền trong laravel?

Hướng dẫn từng bước về vai trò và quyền của người dùng Laravel 9 .
Bước 1. Cài đặt Laravel
Bước 2. Cài đặt gói
Bước 3. Tạo bài di chuyển
Bước 4. Tạo mô hình
Bước 5. Thêm phần mềm trung gian
Bước 6. Thêm tuyến đường
Bước 7. Thêm bộ điều khiển
Bước 8. Thêm yêu cầu

Bảng quản trị vai trò và quyền của laravel là gì?

Bảng quản trị Laravel đi kèm với Vai trò và Quyền. Mỗi người dùng có một vai trò có một nhóm quyền . Bên trong thanh công cụ, bạn có thể thêm, chỉnh sửa hoặc xóa các vai trò hiện tại. Ngoài ra, khi bạn nhấp để chỉnh sửa một vai trò cụ thể, bạn có thể chỉ định quyền CRUD.

Chủ Đề