#php #laravel #routing #acl
#php #laravel #маршруты #acl
Вопрос:
У меня есть этот путь:
http://localhost:8000/home
Я хочу, когда обычный пользователь открывает path выше, тогда я вызываю этот контроллер:
mainPage@index
Но когда администратор открывает этот путь, тогда я вызываю этот контроллер:
panelPage@index
Итак, как вы видите, я ищу что-то вроде «динамических маршрутов» .. Возможна ли такая реализация? Другими словами, могу ли я вызвать два разных контроллера для администратора и обычного участника?
Комментарии:
1. Да, это возможно. Вы можете создавать группы промежуточного программного обеспечения. Используете ли вы аутентификацию Laravel? Вы уже создали что-то вроде AdminMiddleware?
2. @JanWillem Я так понимаю, текущий пользователь — либо администратор, либо обычный участник, подобный этому:
@if( Auth::user()->admin ) { // admin } else { // regular member }
Ответ №1:
Это хороший пример использования промежуточных программ для фильтрации HTTP-запросов.
Вы также могли бы сделать что-то условное в вашем файле маршрутов, например:
if (Auth::user()->isAdmin()){
Route::get('/', 'panelPage@index');
}
else {
Route::get('/', 'mainPage@index');
}
В зависимости от того, как выглядит ваше приложение, вы можете определить isAdmin() в вашей пользовательской модели. Это очень простой пример, где у вас есть столбец с именем role_id, а идентификатор nr 1 равен admin. Если аутентифицированный пользователь является администратором, отображается значение true, в противном случае false:
public function isAdmin()
{
return Auth::user()->role_id == 1;
}
Более динамичным и продвинутым подходом было бы создать таблицу ролей и связать роль с пользователем с помощью сводной таблицы role_user.
Если вы хотите сделать еще один шаг вперед, вы можете создать таблицу разрешений и связать роль с разрешениями с помощью сводной таблицы permission_role. Затем вы можете в своем приложении определить, что для выполнения действия требуется разрешение, и добавить все разрешения, которые имеет данная роль пользователя, в эту сводную таблицу. Затем вы просто проверяете, имеет ли пользователь (с определенной ролью) указанные разрешения.
Комментарии:
1. Выдает эту ошибку:
Call to a member function isAdmin() on null
2. isAdmin — это всего лишь образец, в данном случае вам нужно определить, что такое «isAdmin()». То, как вы это определяете, зависит от того, как вы разработали свое приложение. Если у вас есть «role_id» в таблице users, то вы можете создать метод с именем isAdmin(), который проверяет, является ли соответствующий role_id идентификатором администратора. Итак, когда вы вызываете isAdmin(), вы проверяете, имеет ли пользователь правильный role_id. Я обновлю ответ примером.
Ответ №2:
Для лучшей практики вы могли бы использовать промежуточное программное обеспечение для сортировки и категоризации ваших маршрутов и контроллеров.
В этом — относительно простом — случае вы также могли бы использовать что-то вроде этого (в вашем файле routes).:
if(!is_null(Auth::user())) {
// first check if user is logged in, else Auth::user() will return null
$uses = 'mainPage@index';
if(Auth::user()->admin) {
$uses = 'panelPage@index';
}
Route::get('/', $uses);
}
Обновить
Или вы могли бы обернуть все внутри этого оператора if в группу промежуточного программного обеспечения auth, вот так:
Route::group(['middleware' => ['auth']], function(){
$uses = 'mainPage@index';
if(Auth::user()->admin) {
$uses = 'panelPage@index';
}
Route::get('/', $uses);
});
Также убедитесь, что в вашей таблице users есть столбец с именем ‘admin’.
Комментарии:
1. ваш код выдает эту ошибку:
ErrorException in routes.php line 18: Trying to get property of non-object