我们是否可以使用不同守卫的laravel护照来验证两种不同类型的用户的API。例如,我们为驱动程序用户提供了驱动程序,为供应商用户提供了供应商应用程序。两者都有不同的车型司机和供应商。我们如何使用不同的警卫来使用Laravel验证这两种类型的用户?
发布于 2019-08-06 15:45:44
通过使用简单的中间件,我成功地创建了多个作者(使用laravel/护照)。
步骤1: config/auth.php
将用户类添加到提供程序
'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/中间件中打开新创建的中间件,并更新手动方法如下所示
public function handle($request, Closure $next)
{
config(['auth.guards.api.provider' => 'admin_users']);
return $next($request);
}步骤3:注册中间件
将新创建的中间件添加到$routeMiddleware
protected $routeMiddleware = [
...
'auth.admin' => \App\Http\Middleware\AdminUserProvider::class,
];确保它在$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);
}总结如下:
登录控制器使用雄辩的模型来获取用户对象,然后通过Auth::$user登录用户。
然后,对于需要身份验证的未来请求,新的中间件将把api auth保护提供程序更改为正确的类。
发布于 2020-08-26 16:17:04
经过一段时间之后,我发现在、Laravel 7、中,除了一些配置之外,不需要定制代码。有关详细信息,请查看我在项目多个8月与Laravel 5.4和护照中测试和实现的答案。
发布于 2020-11-23 10:54:22
您不一定需要更改每个请求的配置。每个警卫都需要一个客户。在创建客户端之后,运行
passport:install确保在数据库中指定了提供程序字段。它应该与auth.providers配置值相同。
在创建客户端和保护程序之后,在创建访问令牌时使用以下代码。
App::clearResolvedInstance(ClientRepository::class);
app()->singleton(ClientRepository::class, function () {
return new ClientRepository(User::CLIENT_ID, null); // Client id of the model
});确保在oauth_clients表中指定了提供程序。
https://stackoverflow.com/questions/52851208
复制相似问题