用户的角色-是否使用Gate?

时间:2018-08-10 19:37:07

标签: php laravel laravel-5

我需要实现简单的用户角色,例如管理员,主持人和分析。

我不需要在每个角色上添加权限/功能。只能将一个用户分配给1个角色。

在Laravel中可能有很多方法可以实现,我正在寻找一种实现并确保安全的方法。

Gate外观是正确的方法吗?或使用方法创建Role模型。就像是: 刀片服务器或控制器中的if ($user->hasRole(['admin', 'moderator'])) { //can view this feature }。中间件中可能有比这更干净的方法和角色检查。

1 个答案:

答案 0 :(得分:1)

无论您使用MiddlewareRequest authorize methodPolicies还是Gates(可用作中间件),您仍然需要Role模型。

Roles表将是您存储所有角色并将其按名称或名称附加到用户的位置。

  1. 创建一个Role模型。

    • 编号
    • 名称
  2. 如果您确定用户只能拥有1个Role,则将role_id添加到您的users表中。

  3. UserRole模型中添加relationships

User.php

public function role()
{
    return $this->hasOne(Role::class);
}

Role.php

public function user()
{
     return $this->belongsTo(User::class);
}

4。 在您的AuthServiceProvider.php中,您可以define the gates

(假设role_id不可为空)

Gate::define('do-this', function ($user) {
    return in_array($user->role->name, DoThisClass::allowedRoles());
});
  1. 在刀片中,您可以使用@can directives.检查用户是否有权执行某些任务:

    @can('do-this')
        <button>You can definitely do this!</button>
    @endcan
    
  2. 在您的路线中,您可以使用Gates as a Middleware检查用户是否得到授权:

    Route::group(['middleware' => ['can:do-this']], function () {
        Route::get('do-this', 'DoThisController@action');
    });
    

为什么要将盖茨的名字而不是角色ID绑定?

由于可以删除角色,并且使用角色ID超级不可读,所以我建议使用角色名称。

当使用不同的环境时,ID可能在代码和数据库中不匹配。