在Laravel 5中从超过两个表中验证用户

7 浏览
0 Comments

在Laravel 5中从超过两个表中验证用户

我知道Auth::attempt用于从users表中认证用户,但我想要从managers表中认证另外的用户,以及从admins表中认证管理员。我知道已经存在laravel-multiauth插件。但是我们能否创建自己的AuthServiceProvider来认证来自多个表的用户呢?

0
0 Comments

在Laravel 5中,如果要从多个表中验证用户身份,可以尝试以下方法。原因是因为不同的表中可能存在不同的用户,如果在其他表中存在相同的用户,则无法正常工作。

首先,选择优先级最高的表(例如,users表)。然后,添加以下条件:

if(Auth::user(attempt(...))
elseif(Auth::manager(attempt(...))
elseif(Auth::admins(attempt(...)))

这里的优先级表是users表,如果用户在该表中不存在,它将尝试managers表,如果仍然不存在,它将检查admins表。否则,返回错误消息。

另一种选择是使用sarav/laravel-multiauth包。可以参考这个线程 How to use authentication for multiple tables in Laravel 5 获取更多信息。

其他参考链接:

- https://laracasts.com/discuss/channels/general-discussion/using-laravel-auth-for-multiple-tables?page=1

- Can anyone explain Laravel 5.2 Multi Auth with example

- https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1

感谢答案。

0
0 Comments

在Laravel 5中,如果需要从多个表中对用户进行身份验证,可以通过设置多个认证守卫来实现。每个守卫都有一个不同的提供者,提供者定义了要使用的表或模型。

config/auth.php文件中,可以按照以下方式设置providers,并为每个提供者设置相应的guards

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'managers' => [
        'driver' => 'eloquent',
        'model' => App\Manager::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
]

然后,可以按照以下方式进行身份验证:

Auth::attempt($credentials) // 使用默认守卫进行普通用户身份验证
Auth::guard('manager')->attempt($credentials)
Auth::guard('admin')->attempt($credentials)

通过设置不同的守卫,可以分别对普通用户、管理员和经理进行身份验证。

更多详细信息可以查看这里的文档。

0
0 Comments

问题出现的原因是需要对多个表进行用户认证,解决方法是创建Admin Authenticatable类并扩展Authenticatable、Authorizable和CanResetPassword类,然后创建Admin模型并扩展Authenticatable类。接下来需要修改config/auth.php文件,在providers数组中添加admins配置,在guards数组中添加user和admin配置。然后在LoginController中加入认证代码即可。

创建Admin Authenticatable类:


创建Admin模型:


修改config/auth.php文件:

'providers' => [
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ],
],
'guards' => [
    'user' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
],

在LoginController中进行认证:

if (Auth::guard('user')->attempt(['email' => $email, 'password' => $password])) {
    $details = Auth::guard('user')->user();
    $user = $details['original'];
    return $user;
} else {
    return 'auth fail';
}
if (Auth::guard('admin')->attempt(['email' => $email, 'password' => $password])) {
    $details = Auth::guard('admin')->user();
    $user = $details['original'];
    return $user;
} else {
    return 'auth fail';
}

以上代码可以放在LoginController中的适当位置进行认证。

对于问题"why do you need to create an Admin Authenticable? You can use the existing User Authenticable class..."的回答是可以使用现有的User Authenticable类,但如果需要对Admin用户进行额外的扩展或处理,可以创建Admin Authenticable类。

对于问题"where exactly the last two bits goes inside the LoginController???"的回答是可以将最后两个认证代码放在LoginController的适当位置,例如在login方法中进行认证。

对于问题"$user = $details['original']; is not working, but you can use $user = $details->first(); or $user = $details->all(); (Laravel 8)"的回答是可以使用$details->first()或$details->all()来获取用户信息。

对于问题"This throws 419 | Page expired for me, even running cache clear."的回答是可能是由于页面过期引起的问题,可以尝试运行cache clear命令来清除缓存。

0