使用Spatie的laravel权限包可以实现Facebook对页面权限的实现吗?
个案研究
在Facebook上,您可以创建一个页面,然后您将自动成为该页面的管理员(假设这是一个角色(。 然后,您可以邀请您的朋友并让他/她成为发布者角色
之后,您的朋友还可以邀请您访问他们的主页并让您成为编辑(这是您的另一个角色(
因此,最后您将拥有两个不同个人资料/主页的两个角色。
我想在我的应用程序上实现类似的东西。
编辑
我现在知道的是我可以使用:
$user->assignRole('editor');
我可以检查用户是否具有以下角色:
$user->hasRole('writer')
但问题是我如何将该角色与我希望他们管理的页面链接起来?
就像您在一个页面中具有管理员角色,在另一个页面中具有编辑角色一样。 如果你只是检查$user->hasRole('admin')
结果将永远是真的。所以我想知道我是否可以做些什么来分配并检查您是哪个页面的管理员。
我希望我说得有道理。
假设您的表结构如下所示:
页表
|---------------------|------------------|------------------|------------------|
| id | name | created_at | updated_at |
|---------------------|------------------|------------------|------------------|
| 12 | PHP masters | 2019-02-31 | 2019-03-12 |
|---------------------|------------------|------------------|------------------|
主页管理员
|---------------------|------------------|------------------|------------------|
| id | page_id | role_id | user_id |
|---------------------|------------------|------------------|------------------|
| 1 | 12 | 2 | 2 |
|---------------------|------------------|------------------|------------------|
角色表
|---------------------|------------------|------------------|------------------|
| id | name | created_at | updated_at |
|---------------------|------------------|------------------|------------------|
| 12 | Editor | 2019-02-31 | 2019-03-12 |
|---------------------|------------------|------------------|------------------|
| 12 | System Admin | 2019-02-31 | 2019-03-12 |
|---------------------|------------------|------------------|------------------|
| 12 | Page Admin | 2019-02-31 | 2019-03-12 |
|---------------------|------------------|------------------|------------------|
现在在用户模型中添加此方法
#do not forget to import Roles
#use SpatiePermissionModelsRole;
public function can_manage($page_id) : bool;
{
#Backdoor for the system admin
if ($this->hasRole(['System Admin'])) {
return true;
}
#now we check if the user has the role for that page
$role = Role::select('name')
->join("page_admins", 'page_admins.role_id', '=', 'roles.id')
->where("page_id", $page_id)
->where("user_id", $this->id)
->first();
#return true if roles was found
if (!empty($role)) {
return true;
}
#else false
return false;
}
最后,如果您想检查用户是否可以访问您使用的页面管理员:
#for jwt-auth
#$user = $request->user();
if ( $user->can_manage($page_id) )
{
#then do you things
}
现在您已经了解了如何检查某人是否在页面管理中,您可以发挥创意。 您可以创建一个方法:
#Get user role in the page
#etc
是的。您可以使用工匠创建角色并在 php 中分配它们。
php artisan permission:create-role editor
php artisan permission:create-role publisher
$user->assignRole(['editor', 'publisher']);
所有这些都可以在文档中轻松获得