#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);
}