Как аутентифицировать несколько типов пользователей с одинаковой защитой авторизации [Lumen]

#laravel #authentication #jwt #middleware #lumen

#laravel #аутентификация #jwt #промежуточное программное обеспечение #lumen

Вопрос:

Я разрабатываю приложение API с использованием Lumen 8. У меня есть 3 типа пользователей. Для них я использую 3 разные модели. Я использую аутентификацию JWT [packege- tymon / jwt-auth].

Вот мой Auth.php конфигурация. Я использую 3 типа защиты аутентификации

 return [
'defaults' => [
    'guard' => env('AUTH_GUARD', 'user'),
    'passwords' => 'users',
],

'guards' => [
    'user' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
    'vendor_user' => [
        'driver' => 'jwt',
        'provider' => 'vendor_users',
    ],
    'super_user' => [
        'driver' => 'jwt',
        'provider' => 'super_users',
    ],
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => AppModelsUser::class
    ],
    'vendor_users' => [
        'driver' => 'eloquent',
        'model' => AppModelsVendorUser::class
    ],
    'super_users' => [
        'driver' => 'eloquent',
        'model' => AppModelsSuperUser::class
    ]
],
'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
    'vendor_users' => [
        'provider' => 'vendor_users',
        'table' => 'password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
    'super_users' => [
        'provider' => 'super_users',
        'table' => 'password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
],
'password_timeout' => 10800,
  

];

Для входа в систему я использую 3 разных маршрута, используя упомянутую защиту аутентификации.

     protected function login(Request $request, $guard = 'user')
{
    //validate incoming request
    $this->validate($request, [
        'email' => 'required|string',
        'password' => 'required|string',
    ]);

    $credentials = $request->only(['email', 'password']);

    if (! $token = Auth::guard($guard)->attempt($credentials)) {
        return response()->json(responseFormat(ERROR,___('Unauthorized')), 401);
    }

    return $this->respondWithToken($token);
}

public function userLogin(Request $request)
{
    return $this->login($request,'user');
}

public function superUsersLogin(Request $request)
{
    return $this->login($request,'super_user');
}

public function vendorUsersLogin(Request $request)
{
    return $this->login($request,'vendor_user');
}
  

Мне удалось получить токен для успешного входа в систему от всех 3 типов пользователей.

Но я сталкиваюсь с проблемой, когда я аутентифицирую всех пользователей с помощью промежуточного ПО аутентификации

 public function handle($request, Closure $next, $guard = null)
{
    if ($this->auth->guard($guard)->guest()) {
        return response(responseFormat(ERROR,'Unauthorized.'), 401);
    }

    return $next($request);
}
  

Это работает только для пользователя типа auth-guard по умолчанию (который является user guard). Если я хочу аутентифицировать другие типы пользователей, мне пришлось использовать другой маршрут и указать, какую защиту аутентификации использовать.

 $router->group(['middleware' => 'auth','prefix' => 'api'], function ($router)
{
    $router->get('/send-email', 'EmailController@sendEmail');
    $router->get('/users', 'UsersController@users');


});
$router->group(['middleware' => 'auth:vendor_user','prefix' => 'api/vendor'], function ($router)
{
    $router->get('/send-email', 'EmailController@sendEmail');
    $router->get('/users', 'UsersController@users');

});
$router->group(['middleware' => 'auth:super_user','prefix' => 'api/super_user'], function ($router)
{
    $router->get('/send-email', 'EmailController@sendEmail');
    $router->get('/users', 'UsersController@users');

});
  

Есть ли какой-либо способ, с помощью которого я могу аутентифицировать все 3 типа пользователей для одного и того же маршрута? так что мне не нужно использовать разные маршруты для каждого типа пользователей.

 $router->group(['middleware' => 'auth','prefix' => 'api'], function ($router)
{
    $router->get('/send-email', 'EmailController@sendEmail');
    $router->get('/users', 'UsersController@users');
});
  

Например, этот API может использоваться всеми 3 типами пользователей и аутентифицироваться одним и тем же средством аутентификации или некоторыми другими способами.

BS: я должен использовать 3 разные таблицы для 3 типов пользователей.

Ответ №1:

Создайте отдельное промежуточное программное обеспечение для попытки получения учетных данных. Затем установите защиту по умолчанию, которую должен использовать Auth. Вам не нужно передавать защиту для входа в систему.

В LoginController

     public function  __construct()
    {
        $this->middleware('SetAuthGuard:user')->except('logout');
        $this->middleware('SetAuthGuard:vendor_users')->except('logout');
        $this->middleware('SetAuthGuard:super_users')->except('logout');
    }

  

Промежуточное ПО SetAuthGuard

 

    public function handle(Request $request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;
        $credentials = $request->only('email','password');
        foreach ($guards as $guard) {
            if (Auth::guard($guard)->attempt($credentials)) {
                Auth::shouldUse($guard);
            }
        }
        return $next($request);
    }