Используйте несколько защитных устройств для аутентификации Laravel с помощью Backpack для Laravel

#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 , это, вероятно, приведет к неожиданным результатам, поэтому вы, вероятно, захотите предотвратить это.

Предполагая, что вы используете все контроллеры рюкзака по умолчанию или, по крайней мере, не сильно их модифицировали…

Один из способов добиться этого — выполнить следующее:

  1. запустите composer require funkjedi/composer-include-files see here, это позволит вам загрузить свой собственный вспомогательный файл, прежде чем Backpack попытается загрузить свои вспомогательные функции.

  2. создайте пользовательский вспомогательный файл 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;
         }
     }
      
  3. Обновите файл composer.json следующим образом:

     "extra": {
         "laravel": {
             "dont-discover": []
         },
         "include_files": [
             "app/Helpers/Backpack.php"
         ]
     },
      
  4. создайте пользовательский контроллер входа в 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;
         }
    
     }
      
  5. внутри 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 пройдет мимо, он может знать о более простом способе или обнаружить некоторые подводные камни, которые я не учел.