更新时间:2023-12-02 16:32:34
我设法使用一个简单的中间件创建了多个auth(使用laravel/passport).
I managed to create multiple auths (with laravel/passport) by using a simple middlware.
步骤1:config/auth.php
将您的用户类别添加到提供商
Add your user classes to providers
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'basic_users', // default
],
],
...
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admin_users' => [
'driver' => 'eloquent',
'model' => App\AdminUser::class,
],
'basic_users' => [
'driver' => 'eloquent',
'model' => App\BasicUser::class,
],
],
通过CLI清理缓存
php artisan config:cache
第2步:创建中间件
php artisan make:middleware AdminUserProvider
在app/Http/Middleware中打开新创建的中间件,并更新如下所示的hand方法
Open the newly created middleware in app/Http/Middleware and update the hand method like below
public function handle($request, Closure $next)
{
config(['auth.guards.api.provider' => 'admin_users']);
return $next($request);
}
第3步:注册您的中间件
将新创建的中间件添加到$ routeMiddleware
Add the newly created middleware to $routeMiddleware
protected $routeMiddleware = [
...
'auth.admin' => \App\Http\Middleware\AdminUserProvider::class,
];
并确保它位于$ middlewarePriority的顶部
and make sure it's at the top of $middlewarePriority
protected $middlewarePriority = [
\App\Http\Middleware\AdminUserProvider::class,
...
];
第4步:添加要路由的中间件
Route::group(['middleware' => ['auth.admin','auth:api']], function() {
步骤5:LoginControllers(AdminUserController和BasicUserController)
public function login()
{
$validatedData = request()->validate([
'email' => 'required',
'password' => 'required|min:6'
]);
// get user object
$user = AdminUser::where('email', request()->email)->first();
// do the passwords match?
if (!Hash::check(request()->password, $user->password)) {
// no they don't
return response()->json(['error' => 'Unauthorized'], 401);
}
// log the user in (needed for future requests)
Auth::login($user);
// get new token
$tokenResult = $user->createToken($this->tokenName);
// return token in json response
return response()->json(['success' => ['token' => $tokenResult->accessToken]], 200);
}
总结:
登录控制器使用Eloquent模型获取用户对象,然后通过Auth :: login($ user)登录用户
The login controllers use Eloquent models to get the user object and then log the user in through Auth::login($user)
然后,对于将来需要身份验证的请求,新的中间件会将api auth Guard提供程序更改为正确的类.
Then for future requests that need authentication, the new middleware will change the api auth guard provider to the correct class.