我需要实现简单的用户角色,例如管理员,主持人和分析。
我不需要在每个角色上添加权限/功能。只能将一个用户分配给1个角色。
在Laravel中可能有很多方法可以实现,我正在寻找一种实现并确保安全的方法。
Gate
外观是正确的方法吗?或使用方法创建Role
模型。就像是:
刀片服务器或控制器中的if ($user->hasRole(['admin', 'moderator'])) { //can view this feature }
。中间件中可能有比这更干净的方法和角色检查。
答案 0 :(得分:1)
无论您使用Middleware,Request authorize method,Policies还是Gates(可用作中间件),您仍然需要Role
模型。
Roles
表将是您存储所有角色并将其按名称或名称附加到用户的位置。
创建一个Role
模型。
如果您确定用户只能拥有1个Role
,则将role_id
添加到您的users
表中。
User
和Role
模型中添加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());
});
在刀片中,您可以使用@can directives.检查用户是否有权执行某些任务:
@can('do-this')
<button>You can definitely do this!</button>
@endcan
在您的路线中,您可以使用Gates as a Middleware检查用户是否得到授权:
Route::group(['middleware' => ['can:do-this']], function () {
Route::get('do-this', 'DoThisController@action');
});
为什么要将盖茨的名字而不是角色ID绑定?
由于可以删除角色,并且使用角色ID超级不可读,所以我建议使用角色名称。
当使用不同的环境时,ID可能在代码和数据库中不匹配。