在laravel 5

时间:2015-09-03 14:31:04

标签: php laravel laravel-5

我想在Laravel 5中手动验证用户。我的应用程序使用2个数据库,它们位于同一台服务器上。在我的应用程序中,我已经在模型或查询构建器中切换连接,这非常有效。

但现在我想使用laravels Auth::attempt方法登录用户。但是该用户的凭据存储在第二个数据库中。

在用户模型中,我有:protected $connection = 'first_database'; 这是它通常应该使用的数据库。但对于这个特殊的'登录,我希望用户模型使用second_database

这可能吗?

我尝试了什么:

     \Config::set('database.default', 'second_database');

    // Login this user while using the second_database
    if(\Auth::attempt(['email'=>\Request::get('email'), 'password'=>\Request::get('password')]))
    {
        dd('Success');
    }

但遗憾的是,这并不奏效。 我正在使用 Laravel 5.1

1 个答案:

答案 0 :(得分:0)

请注意,您可以执行以下操作来尝试身份验证:

$this->guard()->attempt([ 'email' => \Request::get('email'), 'password' => \Request::get('password'), ]);

简而言之,您的解决方案需要使用guard()部分:

$this->guard('my-second-database-guard')->attempt([ 'email'=>\Request::get('email'), 'password'=>\Request::get('password') ]);

步骤:

如果您查看auth.php,您会注意到提供商'以及提供商来自哪里?

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
],

提供商参与此部分,同一auth.php

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

因此,我们可以添加另一个使用不同连接的User类,并将其用作我们后卫的提供者。

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

    'master-users' => [
        'driver' => 'eloquent',
        'model' => App\Master\Models\User::class,
    ],
]

在警卫部分:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'master-web' => [
            'driver' => 'session',
            'provider' => 'master-users',
        ],
    ],

当然,我们必须复制User类:

<?php

namespace App\Master\Models;

use App\Models\User as UserClass;

class User extends UserClass
{
     protected $connection = 'second_database';

    /**
     * Get the guard to be used during authentication.
     *
     * @return \Illuminate\Contracts\Auth\StatefulGuard
     */
    protected function guard()
    {
        return Auth::guard('master-web')
    }
}

然后我们可以尝试验证用户:

$this->guard('master-web')->attempt([ 'email' => \Request::get('email'), 'password' => \Request::get('password'), ]);