如何在 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 5 - 针对两个表进行身份验证

在 Laravel 5.3 中使用多个身份验证?

如何进行多个身份验证:laravel 中的用户、管理员、卖家 [关闭]

具有多个角色的 Laravel 身份验证

有没有办法在 laravel 的不同数据库中对用户进行身份验证?

如何在 Laravel 5.2 中创建多重身份验证