为需要身份验证的每种类型的用户使用单独的驱动程序和模型是正确的方法。您可以阅读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,将管理员作为类型 2。
然后,您可以创建一个中间件,每次您的常规用户编程逻辑与管理员的不同时,该中间件都会检查用户是否具有所需的'user_type' 标志。您还可以检查特定 Controller 的实例化。
在本例中,我们将创建两个中间件,一个用于普通用户,另一个用于管理员。这将再次通过使用我们在迁移中定义的属性user_type 来保护相同的User 驱动程序/模型与不同的用户类型访问彼此的资源。
创建两个中间件:
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_type 设置为 2 创建的 Users。
希望对你有所帮助。
干杯!