在Laravel 5中从超过两个表中验证用户
在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 获取更多信息。
其他参考链接:
- Can anyone explain Laravel 5.2 Multi Auth with example
- https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1
感谢答案。
在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)
通过设置不同的守卫,可以分别对普通用户、管理员和经理进行身份验证。
更多详细信息可以查看这里的文档。
问题出现的原因是需要对多个表进行用户认证,解决方法是创建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命令来清除缓存。