Есть ли способ использовать два промежуточных ПО аутентификации в laravel? - PullRequest
0 голосов
/ 25 апреля 2020

Я реализовал паспортную аутентификацию в Laravel и основной c auth. У меня есть UserController и внутри него, у меня есть метод конструктора:

 public function __construct()
    {
        $this->middleware('auth.basic.once')->except(['index', 'show']);   
        $this->middleware('auth:api')->except(['index', 'show']); 
    }

Промежуточное программное обеспечение OnceBasi c:

public function handle($request, Closure $next)
    {
        if(Auth::guard('api')->check())
        return $next($request);
        else
        return Auth::onceBasic() ?: $next($request);
    }

В промежуточном программном обеспечении OnceBasi c я могу чтобы проверить, прошел ли пользователь аутентификацию с использованием auth:api, я запрещаю аутентификации пытаться использовать onceBasic, поэтому он работал правильно при использовании токена доступа. Но происходит сбой при попытке аутентификации с использованием OnceBasi c (электронная почта, пароль), потому что auth:api пытается выполнить аутентификацию тоже, и не удается (пытается вызвать методы redirectTo() внутри по умолчанию \App\Http\Middleware\Authenticate.php)

У меня вопрос, есть ли способ использовать оба этих промежуточных программного обеспечения, чтобы только успешно аутентифицировать одно и предотвратить работу другого?

1 Ответ

1 голос
/ 28 апреля 2020

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

<?php

    Route::middleware(['auth:admin_api'])->group(function () {
        Route::prefix('admin')->group(function () {
            Route::name('api.admin.')->group(function () {

                ////////////////////////////////////////////////////////////
                /// PLACE ADMIN API ROUTES HERE ////////////////////////////
                ////////////////////////////////////////////////////////////
                Route::apiResource('test','App\Http\Controllers\API\MyController');
                ////////////////////////////////////////////////////////////
            });
        });
    });

    Route::middleware(['auth:api'])->group(function () {
        Route::name('api.')->group(function () {
            ////////////////////////////////////////////////////////////
            /// PLACE PUBLIC API ROUTES HERE ///////////////////////////
            ////////////////////////////////////////////////////////////
            Route::apiResource('test', 'App\Http\Controllers\API\MyController');
            ////////////////////////////////////////////////////////////
        });
    });

Поэтому, когда пользователь с правами администратора обращается к admin / test, он использует аутентификацию администратора guard, и когда обычный пользователь идет в / test, он использует стандартную защиту auth. Оба они используют один и тот же контроллер.

Затем я создал базовый контроллер для своего приложения. Вот как я определил с помощью guard для доступа к маршруту в конструкторе:

<?php


use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class BaseController extends Controller
{
    protected $user;

    protected $isAdmin = false;

    public function __construct()
    {
        if(Auth::guard('admin_api')->check()) {
            $this->user = Auth::guard('admin_api')->user();
            $this->isAdmin = true;
        } elseif(Auth::guard('api')->check()) {
            $this->user = Auth::guard('api')->user();
            $this->isAdmin = false;
        } else {
            return response()->json([
                'message' => 'Not Authorized',
            ], 401);
        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...