Hỏi về cách phân quyền trong laravel 5.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
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
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ợ
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()
và 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']]);
}
bạn có thể cho mình contact face book đc k?? mình muốn nc trực tiếp quá
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
@muasaobangdesign mình vừa cập nhật lại profile, bạn ngó qua là thấy fb nhé
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.
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
Bạn có thể dùng Laratrust cũng ok. cài đặt và sử dụng rất dễ dàng