使用一张表 Laravel 5.4 进行多重身份验证
Posted
技术标签:
【中文标题】使用一张表 Laravel 5.4 进行多重身份验证【英文标题】:Multi auth using one table Laravel 5.4 【发布时间】:2017-11-15 02:30:06 【问题描述】:我想使用多重身份验证 Laravel 但只有一个表“用户”
我该如何实现?
【问题讨论】:
如果您询问用户和管理员的单独仪表板,那么您可以在用户表中添加新列作为类型 我的项目的需求是这样的,因为我有管理员后台,但是现在我想为简单用户实现一个小后台,这个小后台和管理员完全不同跨度> @FairyDancer 我想为简单用户实现一个小型后台 两个用户的菜单是否相同? 菜单不同,我的项目是一个在线捐赠网站,我想为网站用户创建一个小空间,以便他们可以查阅他们的捐赠和个人资料,并可以针对每个原因发表评论 【参考方案1】:为需要身份验证的每种类型的用户使用单独的驱动程序和模型是正确的方法。您可以阅读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 创建的 User
s。
希望对你有所帮助。
干杯!
【讨论】:
谢谢@JackGal,我会试试这个逻辑^^ @YassineMabrouk 不用担心。如果您可能想探索多个身份验证驱动程序,我添加了对我的答案的引用。希望我的回答能帮到你! ,不幸的是我尝试了你的逻辑,我无法解决我的需求:( 通过这个方法,我们可以在一个浏览器窗口中同时打开管理页面和普通用户页面吗?同样,如果我们从管理员注销或登录,那么它不应该影响普通用户身份验证,反之亦然。以上是关于使用一张表 Laravel 5.4 进行多重身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如果用户未使用中间件进行身份验证,Laravel 5.4 将重定向到特定页面