Yêu cầu Nov 29th, 2017 4:15 a.m. 3523 2 5
  • 3523 2 5
0

Hỏi về cách phân quyền trong laravel 5.5

Chia sẻ
  • 3523 2 5

Chào các anh/chị/em Mình đang làm 1 project bằng laravel nhưng đến chỗ phân quyền mình thắc mắc 1 chút. Mình có user đc phân quyền theo nhóm. Bây giờ mình muốn làm phần quyền như sau: User thuộc nhóm A không có quyền thêm xóa thành viên chỉ có quyền xem vậy mình phải làm cách nào cho hợp lý. Lưu ý mình design theo repository pattern . Mọi người giúp mình nhé. Mình cảm ơn !!!!

5 CÂU TRẢ LỜI


Đã trả lời Nov 29th, 2017 4:25 a.m.
Đã được chấp nhận
+5

Bạn có thể tạo Policy cho User và thêm nó vào __construct() như một middleware. Nói 1 cách ngắn gọn thì Policy có thể cho biết 1 User có thể thực hiện 1 hay 1 số hành động hay không. Dùng nó khá là tiện lợi.

Ví dụ:

public function __construct()
{
    $this->middleware($this->authMiddleware());
    $this->middleware('can:update', ['only' => ['update', 'delete']]);
}

Bạn đọc thêm về Policy trong document chính thức của Laravel hoặc đọc thêm ở đây https://viblo.asia/p/acl-access-control-list-authorization-in-laravel-51-2p1PvQnJRldr

Chia sẻ
Avatar Sơn Nguyễn @muasaobangdesign
Nov 29th, 2017 4:30 a.m.

Cho mình hỏi mình phân quyền nhóm group, ví dụ nhóm admin thì có tất cả quyền, nhóm mod thì chỉ có xem không có thêm hoặc sửa ấy 😦 . Cảm ơn bạn đã hỗ trợ

Nov 29th, 2017 6:02 a.m.

Mình đưa ra 1 ví dụ bạn tham khảo nhé. Mình tạo Policy quản lý việc sửa, xóa (update) Post. Chỉ có Admin hoặc creator của post đó mới có quyền update. Phương thức isAdmin()isUser() bạn tự viết để xác định xem đây là admin hay normal user. Tương tự bạn có thể viết thêm policy cho việc thêm mới hoặc view từng post.

<?php
namespace App\Policies;

use App\Models\User;
use App\Models\Post;
use App\Models\Contracts\UserInterface; // Tất cả User đều implement UserInterface
use Illuminate\Auth\Access\HandlesAuthorization;

class PostPolicy
{
    use HandlesAuthorization;

    // Mặc định Admin có tất cả các quyền
    public function before(UserInterface $user)
    {
        if ($user->isAdmin()) {
            return true;
        }
    }

    public function update(UserInterface $user, Post $post)
    {
        // Chỉ creator (normal user) mới cập nhật post (sửa, xóa)
        return $user->isUser() && $post->creator_id === $user->id;
    }
}

Thêm PostPolicy vào AuthServiceProvider

<?php
namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        .....
        'App\Models\Post' => 'App\Policies\PostPolicy',
    ];

    public function boot()
    {
        $this->registerPolicies();
    }
}

Trong PostController:

public function __construct()
{
    $this->middleware($this->authMiddleware());
    $this->middleware('can:update', ['only' => ['update', 'delete']]);
}
Avatar Sơn Nguyễn @muasaobangdesign
Nov 30th, 2017 3:02 a.m.

bạn có thể cho mình contact face book đc k?? mình muốn nc trực tiếp quá

Avatar Sơn Nguyễn @muasaobangdesign
Nov 30th, 2017 3:48 a.m.

Mình thấy code của bạn có 1 argument đầu tiên là public function update(UserInterface $user, Post $post) nhưng khi đi vào làm ở policy thì argument đầu tiên là instance của App\User mà mình mà xóa file App\User đi là nó tèo ngay. Code báo lỗi không có file để include

Dec 1st, 2017 6:49 a.m.

@muasaobangdesign mình vừa cập nhật lại profile, bạn ngó qua là thấy fb nhé

Đã trả lời Dec 1st, 2017 4:18 a.m.
+1

Bạn có thể làm theo kiểu Role - permissions, idea của nó tương tự như thế này http://itsolutionstuff.com/post/laravel-52-user-acl-roles-and-permissions-with-middleware-using-entrust-from-scratch-tutorialexample.html như vậy thì bạn ko cần sửa code mà vẫn gán được quyền mà bạn muốn cho bất kỳ users nào.

Chia sẻ
Đã trả lời Dec 1st, 2017 5:00 p.m.
0

Bạn có thể tham khảo cách xây dựng của mình nhé... Mình chỉ test thử nó work, bạn có thể kết hợp middleware (class / route) + policy ( Trong controller hoặc class riêng ) + authorize ( request ) để phân quyền sao cho ok nhất... https://github.com/tvad911/racl-laravel

Chia sẻ
Avatar Truong Chi Nhan @zhangchinhan
Dec 26th, 2017 3:10 p.m.

Bạn có thể dùng Laratrust cũng ok. cài đặt và sử dụng rất dễ dàng

Đã trả lời Dec 26th, 2017 3:11 p.m.
0

Bạn có thể dùng Laratrust. dễ cài đặt và sử dụng.

Chia sẻ
Đã trả lời Dec 26th, 2017 3:11 p.m.
0

Bạn có thể dùng Laratrust. dễ cài đặt và sử dụng.

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí