Как я могу назначить 2 или более ролей пользователей одному маршруту в Laravel?

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

Перенос

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

Я хочу, чтобы только администратор и автор имели доступ к site.com/view/problems этой странице.

Я создал 3 промежуточных программного обеспечения на \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, он сказал, что вы можете получить доступ к этой странице с пользователем Автор.

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

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

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

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


person Amin Arjmand    schedule 20.04.2019    source источник
comment
Если можно спросить, вы имеете в виду, что администратор не может получить доступ к редактору?   -  person Oluwatobi Samuel Omisakin    schedule 20.04.2019
comment
@Namoshek Нет, сэр, это не дубликат, пожалуйста, обратите внимание на мой вопрос и ответ и сравните с этим вопросом и ответом   -  person Amin Arjmand    schedule 20.04.2019
comment
Совершенно очевидно, что см. Указанный ответ. Решение здесь выполняет несколько ролей.   -  person Namoshek    schedule 20.04.2019
comment
Моя проблема решена с помощью решения @BharatGeleda Ссылка, которую вы говорите, имеет getRole (), что я не знаю, что это такое и как я могу это определить! но в этих ответах это ясно и решило мою проблему после нескольких часов поиска в стеке и Google   -  person Amin Arjmand    schedule 20.04.2019


Ответы (2)


Когда вы передаете несколько промежуточных программ в функцию 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

person Bharat Geleda    schedule 20.04.2019
comment
ваш код не проснулся, я должен проверить разрешение laravel - person Amin Arjmand; 20.04.2019
comment
Я по ошибке использовал Author вместо author. Вы можете попробовать с этим. Общая идея, о которой упоминали я и @oluwatobi, одинакова и должна работать, если все сделано правильно. - person Bharat Geleda; 20.04.2019
comment
Да, ваше решение сработало, извините, моя ошибка заключалась в реализации этого нового промежуточного программного обеспечения на kernel.php, еще один вопрос, если я хочу получить доступ к странице для роли редактора, я должен определить новое промежуточное программное обеспечение, да? - person Amin Arjmand; 20.04.2019
comment
Если это требование будет повторяться, я бы посоветовал взглянуть на библиотеку разрешений laravel. Наличие ролей и разрешений будет лучше, и их будет легче изменить позже. - person Bharat Geleda; 20.04.2019
comment
у вас есть помощь (видео или документ), как использовать пакет разрешений laravel? - person Amin Arjmand; 20.04.2019
comment
Их документация кажется довольно обширной. Вы можете посмотреть itsolutionstuff.com/post/, если это поможет. - person Bharat Geleda; 20.04.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);
}

Как видите, я проверил и «автор», и «Администратор», потому что «Администратор» больше, чем автор.

person Oluwatobi Samuel Omisakin    schedule 20.04.2019