我正在尝试为我的应用程序提供高效灵活的RBAC解决方案。我做了一些研究,并认为我创造了以下内容。
在我的用户模型中,我有:
...
public function role() {
return $this->belongsToMany('App\Models\Role', 'user_roles');
}
public function hasRole($role) {
if($this->role->where('name', $role)->first())
return true;
}
...
使用示例:
Route::group(['middleware' => 'auth'], function () {
Route::get('/dashboard', function () {
if (Auth::user()->hasRole('Sales')) {
return view('dashboards/sales');
} else {
return 'Don\'t know where to send you :(';
}
});
});
权限分配给角色,但在上面的示例中未检查权限。然后将角色分配给用户,用户可以拥有许多角色。
我的工作方式是否可扩展且有效的RBAC解决方案?
答案 0 :(得分:3)
我已经制作了一些RBAC
个应用,这取决于您所面临的挑战,例如。
用户有角色,但您希望特定用户可以访问某些区域,例如Posts
,现在用户可以编辑主持人等帖子。在这种情况下,权限方法不仅仅适用于角色方法。
通过slug定义访问权限,其他字段可以用作对超级管理员的引用,或具有讽刺意义的编辑器角色,从现在开始,编辑角色加上允许进入新的"区域"。
public function up()
{
Schema::create('permissions', function (Blueprint $table) {
$table->increments('id')->unsigned();
$table->string('name');
$table->string('slug')->unique();
$table->string('description')->nullable();
$table->string('model')->nullable();
});
}
作为内容数据的示例,
$createUsersPermission = Permission::create([
'name' => 'Create permissions',
'slug' => 'create.permissions',
...
]);
使用示例:
if ($user->can('create.permissions') { // you can pass an id or slug
//
}
个人preference,并且从未按照其他人的建议使用Zizaco Entrust,但它的工作方式相同。你也有级别的方法。
答案 1 :(得分:3)
我做了一点点不同,我在UserRole中创建了hasRole,而不是User(不会影响太多,但根据代码应该是这样)。所以这是我的路线:
Route::group(['middleware' => 'auth'], function () {
Route::get('/myProfile', function () {
if (App\UserRole::hasRole('ROLE_CUSTOMER',Auth::user())) {
return view('views/customer');
} else {
return 'Don\'t know where to send you :(';
}
}); });
Next Thing是我的UserRole中的方法。我试着保持简单:
public static function hasRole($authority,$user) {
$role = Role::where('authority',$authority)->first();
$userRole = UserRole::where('role_id',$role->id)
->where('user_id',$user->id)->first();
if($userRole){
return true;
}
}
我们寻找权限(ROLE_USER,ROLE_CUSTOMER等),$ user是从DB检索的用户对象。 根据您的问题/其他一切运行/ 希望能帮助到你! 干杯!
答案 2 :(得分:0)
由于laravel中没有可用于基于角色的身份验证的开箱即用解决方案。您可以创建定义应用程序可以具有的所有可能角色的自定义角色表,以及包含用户和角色关联的role_user表。
您可以在用户模型下创建方法,以检查用户是否属于特定角色。利用该方法注册新的中间件。中间件可以附加到路由或控制器。
此链接提供了详细的演示 https://www.5balloons.info/user-role-based-authentication-and-access-control-in-laravel/