Управление доступом к базе данных 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/