【发布时间】:2017-09-13 10:55:21
【问题描述】:
我是 Laravel 的新手,我正在尝试基于角色构建应用程序,但在我的情况下,用户只能拥有一个角色(用户和角色之间没有数据透视表),我们可以创建新角色我们喜欢(为一个角色分配许多权限)。有什么帮助吗?非常感谢
【问题讨论】:
-
err,你尝试了什么..?另外,有什么理由反对使用包?如果你不介意,你可以从现有的包中学习......
标签: laravel
我是 Laravel 的新手,我正在尝试基于角色构建应用程序,但在我的情况下,用户只能拥有一个角色(用户和角色之间没有数据透视表),我们可以创建新角色我们喜欢(为一个角色分配许多权限)。有什么帮助吗?非常感谢
【问题讨论】:
标签: laravel
所以这是我会做的一种方法。
你需要两张桌子:
一张我称之为“等级”的表格,在其中您可以了解等级本身的所有信息:
当然,它的 id 也是 :
是管理员级别吗? (所有权限)
它叫什么名字? ...
我称之为“ranks_abilities”的一个表,在其中您可以了解有关等级可以做什么的所有信息
因此,它将包含三列:id、rank_id 和能力名称
而且你需要把 rank_id 放在 users 表中。
注意:如果你想做得很好,你可以有一个包含所有可能能力的表“能力”,你可以引用他们的 ID 而不是名字
那么它是如何工作的呢?
因此您将拥有三个模型:
在您的 User 模型中,您将与 Rank 模型有一个 belongs_to 关系(称之为 rank) 在 Rank 模型内部,您与 RanksAbility 模型有一个 has_many 关系(称为 ranks_abilities)
我想我们现在对数据库结构很好,让我们开始允许做一些事情。
所以,当然,在需要登录的地方,你有完美的身份验证中间件
然后,要自己处理权限,有几种方法可以做到,这是我推荐的一种。
第一步:
为某些操作创建策略,例如,如果您有帖子,您可以创建 PostPolicy (https://laravel.com/docs/5.4/authorization#creating-policies)
例如,如果您想要一个权限,以便用户可以编辑所有帖子,您将在该 PostPolicy 中有一个更新方法
public function update(User $user, Post $post)
{
return $user->hasPermission('post.update'); // You can also add other permissions for example if the post belongs to your user I'd add || $post->user_id == $user->id
}
我会做这样的事情。
然后,您必须创建 hasPermission 方法。
所以,在你的用户模型中,你可以这样写:
public function hasPermission($permission){
if(!$this->relationLoaded('rank')){
$this->load('rank', 'rank.ranks_abilities');
}
if(!$this->rank){
return false;// If the user has no rank, return false
}
foreach($this->rank->rank_abilities as $ability){
if($permission === $ability->name){
return true;// If the user has the permission
}
}
return false;
}
到这里方法就完成了。
最后一步,您可以使用此处列出的所有方法https://laravel.com/docs/5.4/authorization#authorizing-actions-using-policies 来避免用户做他不能做的事情。
就我个人而言,我会做一个 FormRequest,并用它来处理授权 (https://laravel.com/docs/5.4/validation#authorizing-form-requests)。
我希望清楚,如果您还有其他问题,请继续
【讨论】:
要设置自定义用户角色和权限,您可以尝试https://thewebtier.com/laravel/understanding-roles-permissions-laravel/。
这是关于如何在 Laravel 项目中设置角色和权限的完整指南。
【讨论】: