我想使用多重身份验证Laravel,但只使用一个表"用户"
我该如何实现?
答案 0 :(得分:3)
需要身份验证的每种类型用户的单独驱动程序和模型是正确的方法。您可以阅读this主题,并了解有关它的更多信息。话虽如此,如果你想要快速但不那么安全和可扩展的东西,你可以做到以下几点:
您的用户迁移中可能有一个标志,用于确定用户的类型,如下所示:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->unsignedInteger('user_type');
$table->rememberToken();
$table->timestamps();
});
}
对于此示例,我们将常规用户作为类型1,将Admin作为类型2。
然后,您可以创建一个中间件,用于检查用户每次常规用户编程逻辑与管理员的编程逻辑不同时是否具有所需的'user_type'
标记。您还可以检查特定Controller
的实例化。
在这个例子中,我们将创建两个中间件,一个用于普通用户,另一个用于管理员。这将通过使用我们在迁移中定义的属性User
来保护使用不同用户类型访问彼此资源的相同user_type
驱动程序/模型。
创建两个中间件:
php artisan make:middleware UserMiddleware
和
php artisan make:middleware AdminMiddleware
我们在Kernel.php
注册了这些内容。它应该是这样的:
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'user' => \App\Http\Middleware\UserMiddleware::class,
'admin' => \App\Http\Middleware\AdminMiddleware::class
];
一旦我们在内核中注册了中间件,我们就会修改他们的handle()
方法以满足我们的需求:
UserMiddleware.php
:
public function handle($request, Closure $next)
{
if(Auth::user()->user_type == 1)
return $next($request);
return redirect('/');
}
AdminMiddleware.php
:
public function handle($request, Closure $next)
{
if(Auth::user()->user_type == 2)
return $next($request);
return redirect('/');
}
Auth::user()
Facade会在两种情况下返回您登录用户的实例,然后我们会检查它是1还是2.如果它们与相应的值匹配,我们会前往我们想要的任何地方要去,否则,我们可以重定向到您应用中的其他位置,例如主路线/
。
在此之后,我们可以使用我们全新的中间件来保护路由或控制器。
例如,如果您想让路由仅供管理员使用,而不是普通用户,则可以执行以下操作:
routes/web.php
:
Route::get('/admin', function () {
return view('admin');
})->middleware('admin');
然后,该特定路由将受到保护,这些User
是在属性user_type
设置为2的情况下创建的。
我希望这对你有所帮助。
干杯!