Как я могу назначить 2 или более роли пользователя одному маршруту в Laravel? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть пользовательская таблица с ролью столбца для пользовательских ролей со значением Enum:

Миграция

$table->enum('role', ['Admin','author','editor']);

Мне нужны только Администратор и автор Пользователь может получить доступ к site.com/view/problems этой странице.

Я создал 3 Middlewares на \app\http\Middleware с этим содержимым.

public function handle($request, Closure $next)
{
    if ($request->user() && $request->user()->role != 'Admin') {
        return new Response(view('unauthorized')->with('role', 'Admin'));
    }

    return $next($request);
}

и поместите их в Kernal.php

protected $routeMiddleware = [
        'Admin' =>\App\Http\Middleware\AdminMiddleware::class,
        'author' =>\App\Http\Middleware\authorAdminMiddleware::class,
        'editor' =>\App\Http\Middleware\editorAdminMiddleware::class,
    ];

затем использовал их в web.php вот так

Route::get('/view/problems', function () {
    //
})->middleware('Admin', 'editor');

Но когда я вошел в систему с Admin пользователем, он говорит, что вы можете получить доступ к этой странице с автором пользователя.

И когда я вошел в систему с автором пользователя, он говорит, что вы можете получить доступ к этой странице с помощью admin пользователя.

Я хочу, когда я вошел в систему с Admin или автор роль пользователя, Может получить доступ к этой странице. И когда я вошел в систему с , редактор не может получить доступ к этой странице.

Я также использовал Группы промежуточного программного обеспечения . И похоже, что раньше.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Полагаю, что иерархия ролей находится в следующем порядке: «Администратор» -> «Автор» -> «Редактор».

Если вышеизложенное имеет место, а затем сказать,

  • Администратор и автор могут видеть то, что видит редактор,
  • Администратор может видеть все,
  • редактор может видеть только редактор,
  • Автор может видеть, что принадлежит ему и редактору

Тогда ваша автор промежуточная программа handle() может выглядеть следующим образом:

public function handle($request, Closure $next)
{
    if ($request->user() && in_array($request->user()->role, ['Admin','author'])) {

        return new Response(view('unauthorized')->with('role', $request->user()->role));
    }
    return $next($request);
}

Как вы можете видеть, я проверил как 'author', так и 'Admin', потому что 'Admin' больше, чем автор.

1 голос
/ 20 апреля 2019

Когда вы передаете несколько промежуточных программ в функцию middleware (), требуется, чтобы все промежуточные программы были запущены и переданы.Теперь, если у пользователя нет обеих ролей, он потерпит неудачу.

Одна вещь, которую вы могли бы сделать, это определить новое промежуточное программное обеспечение, которое проверяет, является ли пользователь автором или редактором, и пропускает его как

public function handle($request, Closure $next)
    {
        if ($request->user() && $request->user()->role != 'Admin' && $request->user()->role != 'author') {
            return new Response(view('unauthorized')->with('role', 'Admin'));
        }
        return $next($request);
    }

Другая вещь, которую вы можете сделать, это посмотреть на разрешения, т.е. назначитьконкретные разрешения для обеих ролей.Скажите CanViewProblemsPermission и назначьте его обеим ролям.Вам потребуется реализовать это самостоятельно или использовать библиотеку типа this

...