我想在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
答案 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'),
]);