Laravel角色和权限

时间:2017-04-17 19:14:06

标签: laravel

我是Laravel的新手,我正在尝试基于角色构建应用程序,但在我的情况下,用户只能有一个角色(用户和角色之间没有透视表),我们可以创建新的角色我们我们喜欢(为一个角色分配许多权限)。有帮助吗?非常感谢

2 个答案:

答案 0 :(得分:0)

所以这是我要做的一种方式。

您需要2张桌子:

  • 我称之为“排名”的一张桌子,在里面你可以拥有排名本身的所有内容:
    它当然是id,但也是:
    是管理员级别吗? (所有权限)
    它叫什么名字? ......

  • 我称之为“rank_abilities”的一个表,在其中你可以得到关于排名可以做什么的所有内容 因此,它将有三列:id,rank_id和能力名称

您需要将rank_id放在users表中。

注意:如果你想要做得非常好,你可以拥有一个包含所有可能能力的表“能力”,并且你会引用他们的ID而不是名字

那怎么会有用呢?

因此,您将有三种模式:

  • 用户
  • 等级
  • RanksAbility

在您的用户模型中,您与Rank模型有一个belongs_to关系(称之为排名) 在Rank模型中,你与RanksAbility模型有一个has_many关系(称之为rank_abilities)

我想我们现在对数据库结构很好,让我们到了允许做某事的地步。

因此,当然,在需要登录的地方,您可以使用完美的中间件

然后,要处理权限本身,有几种方法可以做,这是我建议的。

第1步:

为某些操作创建策略,例如,如果您有可以创建PostPolicy的帖子(https://msdn.microsoft.com/en-us/library/ms182203.aspx

例如,如果您想要一个权限以便用户可以编辑所有帖子,那么您在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#creating-policies,以避免用户做出他不能做的事情。

就个人而言,我会做一个FormRequest,并用它来处理授权(https://laravel.com/docs/5.4/authorization#authorizing-actions-using-policies)。

如果您还有其他问题,我希望能够明白

答案 1 :(得分:0)

要设置自定义的用户角色和权限,您可以尝试https://thewebtier.com/laravel/understanding-roles-permissions-laravel/

这是有关如何在Laravel项目中设置角色和权限的完整指南。