#laravel #authentication #laravel-backpack
#laravel #аутентификация #laravel-backpack
Вопрос:
У меня есть свой Laravel auth.php настройка с несколькими поставщиками и несколькими охранниками.
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'account' => [
'driver' => 'session',
'provider' => 'accounts',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => AppModelsUser::class,
],
'accounts' => [
'driver' => 'eloquent',
'model' => AppModelsAccount::class,
],
],
Внутри config/backpack/base.php в нем есть опция , которую вы можете установить 'guard' => null
. Я хотел бы настроить это так, чтобы оно отображало как account
и, так и web
защиту, а не только web
защиту по умолчанию. Я понимаю, что могу это изменить, но я хочу разрешить пользователям с a web
или a account
guard доступ к администратору backpack.
Комментарии:
1. почему в первую очередь 2 разные модели?
2. Они по-разному управляются администратором, имеют разные структуры отношений и различные другие различия.
3. что ж, это веская причина
![]()
Ответ №1:
ПРЕДУПРЕЖДЕНИЕ
Я протестировал приведенное ниже вплоть до входа в систему (с логином «пользователь» и «учетная запись», и все работало, как ожидалось. Я не тестировал другие функции аутентификации, то есть регистрацию, забытые электронные письма с паролем, сброс пароля. Я ожидаю, что они будут работать так, как указано в приведенных ниже изменениях, но вам может потребоваться немного изменить их, если вы столкнетесь с проблемами, кроме того, если вы разрешаете пользователям с одинаковыми учетными данными в обеих таблицах users
and accounts
, это, вероятно, приведет к неожиданным результатам, поэтому вы, вероятно, захотите предотвратить это.
Предполагая, что вы используете все контроллеры рюкзака по умолчанию или, по крайней мере, не сильно их модифицировали…
Один из способов добиться этого — выполнить следующее:
-
запустите
composer require funkjedi/composer-include-files
see here, это позволит вам загрузить свой собственный вспомогательный файл, прежде чем Backpack попытается загрузить свои вспомогательные функции. -
создайте пользовательский вспомогательный файл at
app/Helpers/Backpack.php
с этим содержимым:<?php if (! function_exists('backpack_guard_name')) { /* * Returns the name of the guard defined * by the application config */ function backpack_guard_name() { $guards = array_keys(config('auth.guards')); return implode(',', $guards); } } if (! function_exists('backpack_auth')) { /* * Returns the user instance if it exists * of the currently authenticated admin * based off the defined guard. */ function backpack_auth() { return Auth::guard(find_current_guard()); } } if (! function_exists('find_current_guard')) { /* * Returns the guard name being used by the * currently authenticated user, or the default */ function find_current_guard() { // set to the default to start with $guard = config('backpack.base.guard'); // get all possible guard names $guards = array_keys(config('auth.guards')); foreach ($guards as $currentGuard) { if (Auth::guard($currentGuard)->check()) { $guard = $currentGuard; break; } } return $guard; } }
-
Обновите файл composer.json следующим образом:
"extra": { "laravel": { "dont-discover": [] }, "include_files": [ "app/Helpers/Backpack.php" ] },
-
создайте пользовательский контроллер входа в
app/Http/Controllers/Admin/Auth/LoginController.php
систему с этим содержимым (или где угодно, просто измените последующие шаги, если вы разместите его в другом месте)namespace AppHttpControllersAdminAuth; use IlluminateHttpRequest; class LoginController extends BackpackCRUDappHttpControllersAuthLoginController { /** * Attempt to log the user into the application. * * @param IlluminateHttpRequest $request * @return bool */ protected function attemptLogin(Request $request) { $loggedIn = false; // get all possible guard names $guards = array_keys(config('auth.guards')); foreach ($guards as $currentGuard) { $loggedIn = Auth::guard($currentGuard)->attempt( $this->credentials($request), $request->filled('remember') ); if ($loggedIn) { break; } } return $loggedIn; } }
-
внутри
routes/backpack/custom.php
(создайте, если он не существует) добавьте этот код, обратите внимание, что здесь мы включаем все маршруты рюкзака по умолчанию, но затем мы закомментируем маршрут входа, а внизу мы добавим наш собственный маршрут входа, указывающий на контроллер, который мы создали выше:use IlluminateSupportFacadesRoute; // This file is here so the backpack package will see that, // and load this file, instead of the one in the package /* |-------------------------------------------------------------------------- | BackpackBase Routes |-------------------------------------------------------------------------- | | This file is where you may define all of the routes that are | handled by the BackpackBase package. | */ Route::group([ 'namespace' => 'BackpackCRUDappHttpControllers', 'middleware' => config('backpack.base.web_middleware', 'web'), 'prefix' => config('backpack.base.route_prefix'), ], function () { // if not otherwise configured, setup the auth routes if (config('backpack.base.setup_auth_routes')) { // Authentication Routes... Route::get('login', 'AuthLoginController@showLoginForm')->name('backpack.auth.login'); // Route::post('login', 'AuthLoginController@login'); // COMMENT OUT THIS LINE HERE Route::get('logout', 'AuthLoginController@logout')->name('backpack.auth.logout'); Route::post('logout', 'AuthLoginController@logout'); // Registration Routes... Route::get('register', 'AuthRegisterController@showRegistrationForm')->name('backpack.auth.register'); Route::post('register', 'AuthRegisterController@register'); // Password Reset Routes... Route::get('password/reset', 'AuthForgotPasswordController@showLinkRequestForm')->name('backpack.auth.password.reset'); Route::post('password/reset', 'AuthResetPasswordController@reset'); Route::get('password/reset/{token}', 'AuthResetPasswordController@showResetForm')->name('backpack.auth.password.reset.token'); Route::post('password/email', 'AuthForgotPasswordController@sendResetLinkEmail')->name('backpack.auth.password.email'); } // if not otherwise configured, setup the dashboard routes if (config('backpack.base.setup_dashboard_routes')) { Route::get('dashboard', 'AdminController@dashboard')->name('backpack.dashboard'); Route::get('/', 'AdminController@redirect')->name('backpack'); } // if not otherwise configured, setup the "my account" routes if (config('backpack.base.setup_my_account_routes')) { Route::get('edit-account-info', 'MyAccountController@getAccountInfoForm')->name('backpack.account.info'); Route::post('edit-account-info', 'MyAccountController@postAccountInfoForm')->name('backpack.account.info.store'); Route::post('change-password', 'MyAccountController@postChangePasswordForm')->name('backpack.account.password'); } }); // Load our custom login route Route::group([ 'prefix' => config('backpack.base.route_prefix', 'admin'), 'middleware' => config('backpack.base.web_middleware', 'web'), 'namespace' => 'AppHttpControllersAdmin', ], static function () { // Authentication Routes... Route::post('login', 'AuthLoginController@login'); });
Комментарии:
1. Если @tabacitu пройдет мимо, он может знать о более простом способе или обнаружить некоторые подводные камни, которые я не учел.