Управление доступом к базе данных Laravel 5
Я пытаюсь найти эффективное и гибкое решение RBAC для своего приложения. Я провел небольшое исследование и думаю, что создал следующее.
В моей модели User у меня есть:
...
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?
Ответы
Ответ 1
Я сделал несколько приложений RBAC
, и это зависит от того, с каким видом вы сталкиваетесь, например,
Пользователь имеет роль, но вы хотите, чтобы определенный пользователь имел доступ к какой-либо области, например Posts
, теперь пользователь может редактировать сообщения, такие как Модератор. Подход разрешений в этом случае подходит лучше, чем просто ролевой подход.
Определить доступ с помощью slug, другие поля могут использоваться в качестве ссылки на Super Admin или, как это ни парадоксально, для роли редактора, начиная с теперь, роли редактора и разрешения на новый "area".
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
//
}
Лично предпочтение и никогда не использовалось Zizaco Entrust как предложенный другими людьми, но он работает одинаково. Также у вас есть подход к уровню.
Ответ 2
Я немного поменял, я сделал hasRole в UserRole, а не 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 :(';
}
}); });
Следующая вещь - это метод в 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 - Пользовательский объект, полученный из БД.
Все остальное работает по вашему вопросу/
Надеюсь, поможет!
Ура!
Ответ 3
Так как для проверки подлинности на основе ролей в laravel нет доступного решения для ящиков. Вы можете создать настраиваемую таблицу ролей, которая определяет все возможные роли, которые может иметь ваше приложение, и таблицу role_user, которая содержит ассоциацию пользователя и ролей.
Вы можете создавать методы под своей моделью пользователя, чтобы проверить, принадлежит ли пользователь к определенной роли. Используйте этот метод для регистрации нового промежуточного программного обеспечения. Среднее ПО может быть атташе для маршрутов или контроллеров.
Подробное демо указано в этой ссылке
https://www.5balloons.info/user-role-based-authentication-and-access-control-in-laravel/