在 Laravel 8 中创建自定义身份验证可以通过以下步骤实现:
app/Providers/AuthServiceProvider.php
文件的 boot
方法中调用 Auth::extend
方法创建自定义的身份验证驱动。例如,创建一个基于 JWT 的自定义身份验证驱动,可以在 boot
方法中添加如下代码:
use App\Extensions\JwtAuthGuard;
public function boot()
{
$this->registerPolicies();
Auth::extend('jwt', function ($app, $name, array $config) {
return new JwtAuthGuard(Auth::createUserProvider($config['provider']), $app->make('request'));
});
}
app/Extensions
目录下创建一个 JwtAuthGuard
类,该类需要实现 Illuminate\Contracts\Auth\Guard
接口的方法,并实现自定义的身份验证逻辑。例如,JwtAuthGuard
类的示例代码如下:
namespace App\Extensions;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;
class JwtAuthGuard implements Guard
{
protected $provider;
protected $request;
public function __construct(UserProvider $provider, Request $request)
{
$this->provider = $provider;
$this->request = $request;
}
public function user()
{
if ($this->request->hasHeader('Authorization')) {
$token = $this->request->header('Authorization');
// 解析验证 JWT token 的逻辑
$user = JWTAuth::parseToken()->authenticate();
return $user;
}
return null;
}
// 实现其他接口方法...
}
config/auth.php
配置文件,将 'defaults'
中的 'guard'
改为 'jwt'
,并在 'guards'
数组中添加一个 'jwt'
配置项,指定驱动为我们创建的自定义驱动。例如,将 'defaults'
和 'guards'
中的配置修改如下:
'defaults' => [
'guard' => 'jwt',
// ...
],
'guards' => [
// ...
'jwt' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
make:middleware
Artisan 命令创建一个自定义的身份验证中间件,该中间件将用于保护需要身份验证的路由。例如,使用以下命令创建一个名为 JwtMiddleware
的自定义中间件:
php artisan make:middleware JwtMiddleware
app/Http/Middleware/JwtMiddleware.php
),将 handle
方法中的身份验证逻辑实现为调用 Auth::guard('jwt')->user()
。例如,JwtMiddleware
类的示例代码如下:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class JwtMiddleware
{
public function handle($request, Closure $next)
{
if (Auth::guard('jwt')->user()) {
return $next($request);
}
return response('Unauthorized.', 401);
}
}
app/Http/Kernel.php
文件,在 $routeMiddleware
属性中注册刚刚创建的自定义中间件。例如,将 $routeMiddleware
中的配置修改如下:
protected $routeMiddleware = [
// ...
'jwt.auth' => \App\Http\Middleware\JwtMiddleware::class,
// ...
];
'middleware' => 'jwt.auth'
来将自定义中间件应用于特定路由或路由组。例如,路由定义示例:
Route::group(['middleware' => 'jwt.auth'], function () {
Route::get('/protected', function () {
return 'This route requires authentication.';
});
});
至此,在 Laravel 8 中创建自定义身份验证的过程完成。根据具体需求,可以根据步骤2和步骤5中的示例代码,自定义实现其他身份验证逻辑。
领取专属 10元无门槛券
手把手带您无忧上云