如何在 Laravel 5 中对多个表使用身份验证
Posted
技术标签:
【中文标题】如何在 Laravel 5 中对多个表使用身份验证【英文标题】:How to use authentication for multiple tables in Laravel 5 【发布时间】:2015-05-25 09:32:16 【问题描述】:有时,我们希望将用户和管理员分隔在不同的 2 个表中。 我认为这是一个很好的做法。
我正在寻找在 Laravel 5 中是否可行。
【问题讨论】:
@DerGolem 提出这个问题时我已经发布了解决方案。看不到? 【参考方案1】:在阅读以下内容之前,你应该对 Laravel 5 中的 ServiceProvider、Facade 和 IoC 有基本的了解。开始吧。
根据 Laravel 的文档,您会发现 Facade 'Auth' 指的是 Illuminate\Auth\AuthManager
,它有一个神奇的 __call()。你可以看到主要功能不在AuthManager,而是在Illuminate\Auth\Guard
Guard 有一个提供者。此提供程序具有$model
属性,根据该属性,EloquentUserProvider
将由"new $model"
创建此模型。这些都是我们需要知道的。代码如下。
1.我们需要创建一个AdminAuthServiceProvider
。
public function register()
Auth::extend('adminEloquent', function($app)
// you can use Config::get() to retrieve the model class name from config file
$myProvider = new EloquentUserProvider($app['hash'], '\App\AdminModel')
return new Guard($myProvider, $app['session.store']);
)
$app->singleton('auth.driver_admin', function($app)
return Auth::driver('adminEloquent');
);
2.立面:
class AdminAuth extends Facade
protected static function getFacadeAccessor() return 'auth.driver_admin';
3。将别名添加到内核:
'aliases' => [
//has to be beneath the 'Auth' alias
'AdminAuth' => '\App\Facades\AdminAuth'
]
希望这会有所帮助。
【讨论】:
我认为可能存在安全问题。如果您网站的管理员部分与用户部分共享会话,如果经过身份验证的普通用户尝试访问管理面板,则如果存在与该普通用户相同的管理员,则他可能会获得访问权限。 这种方法真的有安全问题吗? 如果我理解正确,“管理员”和“非管理员”用户将位于不同的表中。在这种情况下,您将查询管理区域的“admin”表,以及非管理区域的“用户”。因此,具有重叠 ID 的用户应该不是问题,因为您只会在 'admin' 表中查找 'admin' 用户。即使您知道用户的 ID,也必须具有匹配的用户名和密码才能设置会话,因此这里应该没有问题。会话,而不是用户 ID,是“关键”,php 保证是唯一的(假设最佳实践)。 @yixiang 这毕竟是潜在的安全漏洞。我已经为多重身份验证实现了另一种解决方法,但仍然存在与如果管理员和普通用户 id 匹配的问题相同的问题,它将允许用户以管理员身份登录。【参考方案2】:我创建了一个 laravel 包,您可以在其中处理多个身份验证。
第 1 步:作曲家要求
首先,composer 需要 multiauth 包
composer require sarav/laravel-multiauth dev-master
第 2 步:替换默认身份验证服务提供商
替换
Illuminate\Auth\AuthServiceProvider::class
与
Sarav\Multiauth\MultiauthServiceProvider
在您的 config/app.php 文件中
第三步:修改 auth.php
将您的 config/auth.php 文件修改为类似的内容
'multi' => [
'user' => [
'driver' => 'eloquent',
'model' => App\User::class,
'table' => 'users'
],
'admin' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
'table' => 'admins'
]
],
就是这样!现在您可以通过将用户作为第一个参数传递来尝试多重身份验证。例如
\Auth::loginUsingId("user", 1); // Login user with id 1
\Auth::loginUsingId("admin", 1); // Login admin with id 1
// Attempts to login user with email id johndoe@gmail.com
\Auth::attempt("user", ['email' => 'johndoe@gmail.com', 'password' => 'password']);
// Attempts to login admin with email id johndoe@gmail.com
\Auth::attempt("admin", ['email' => 'johndoe@gmail.com', 'password' => 'password']);
更详细的文档
http://sarav.co/blog/multiple-authentication-in-laravel/
http://sarav.co/blog/multiple-authentication-in-laravel-continued/
【讨论】:
它正在工作,但是如何检查管理员是否登录。 我正在获取 Illuminate/Auth/Gaurd 未找到。 :( 仍然添加了所有提供者。请帮助 未找到照明/验证/Gaurd。这个库从来没有工作过。不要使用这个库以上是关于如何在 Laravel 5 中对多个表使用身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何进行多个身份验证:laravel 中的用户、管理员、卖家 [关闭]