我使用Laravel 5.4及其内置的Auth API。我在users
表中添加了一个名为is_admin
的列。我想修改登录过程,以便登录仅在is_admin == 1
时有效。我查看了Illuminate\Foundation\Auth\AuthenticatesUsers.php
(Github),我可能会在那里做一些改变,但如果可能的话,我宁愿不打扰核心。有没有更优雅的方式来做到这一点?Laravel auth在登录之前检查列
回答
我解决这与类似@Sagar的解决方案阿罗拉的。在运行artisan make:auth
时创建的app\Http\Controllers\Auth\LoginController.php
中,我忽略了AuthenticatesUsers
中的attemptLogin
方法。这是代码在LoginController.php
:
protected function attemptLogin(Request $request)
{
return (auth()->attempt(['email' => $request->email, 'password' => $request->password, 'is_admin' => 1]));
}
与is_admin == 1
现在只有用户也将登录
您可以创建你的登录功能:
if (Auth::attempt(['email' => $email, 'password' => $password, 'is_admin' => 1])) {
// The user is active, not suspended, and exists.
}
您与其他字段检查这里的手动登录过程:
https://laravel.com/docs/5.4/authentication#authenticating-users
因此,在您登录功能,你可以通过检查这谢谢
我认为一个更好的方法是实际上允许所有用户登录。然后通过admin
限制访问中间件。这样你可以将这个中间件应用到任意数量的路由中。
在
Route::group(['middleware' => 'admin'], function() {
// auth protected routes
});
这样通过包装必要途径使用它创建app\Http\Middleware\RedirectIfNotAdmin
:
<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfNotAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user = $request->user();
if ($user && $user->is_admin) {
return $next($request);
}
return redirect('/');
}
}
然后在app\Http\Kernel.php
你把它添加到$routeMiddleware
属性:
protected $routeMiddleware = [
// ... other middlewares
'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class
];
谢谢。你说你认为这更好 - 为什么(只是好奇)?例如,我的意思是为什么不创建一个名叫“admin”的新卫队。 – GluePear
@GluePear好的,一名警卫也可以解决这个问题。但是,如果使用'admin'后卫,那么假设使用相同的'session'驱动程序,则需要创建整个'admins'表和模型。我认为将用户保存在一张表中是一种很好的做法,因此随着应用程序的增长,您只需添加权限/角色。所以是使用警卫是一种解决方案。但在这种情况下,我会说这是相当大胆,然后优雅。 –
@GluePear我还会补充一点,有时候有几个用户表也可以。例如,当你让后台站点只能用于管理员时。但认为它仍然可以在一张桌子内完成。听到其他方法会很高兴 –
就像你提到的,你永远不应该触及核心文件。但是如果你能看到laravel已经在LoginController上添加了AuthenticatesUsers
作为trait
这意味着你可以简单地通过覆盖它在LoginController中加入credentials()
就像下面这样。
/**
* Get the needed authorization credentials from the request.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
protected function credentials(Request $request)
{
return [
'email' => $request->input('email'),
'password' => $request->input('password'),
'is_admin' => 1
];
}
有趣。我不知道这是否比我的回答更好(在LoginController中重写'attemptLogin')。 – GluePear
该解决方案可能不够优雅,但仍然有效。
一下添加到LoginController
:
protected function authenticated(Request $request, $user)
{
if (! $user->is_admin) {
Auth::logout();
return redirect('login')->withErrors(['is_admin' => 'Only admin users may log in']);
}
}
然后把这个auth/login.blade.php
:
@if($errors->has('is_admin'))
<div class="alert alert-danger" role="alert">{{ $errors->first('is_admin') }}</div>
@endif
也请记住,你应该禁用寄存器功能,因为注册用户仍登录后。
- 1. 在laravel auth中间件之前检查会话变量
- 2. Laravel Auth - 重定向登录
- 3. 登录之前检查用户状态
- 4. Cartalyst/Sentinel Laravel 5.4 - 在登录用户之前检查数据库字段
- 5. 在Laravel更新之前查看记录
- 6. laravel 5.1 auth登录返回错误
- 7. 之前登录
- 8. 检查用户是否在Google+之前登录应用程序?
- 9. Facebook JS SDK:在登录PopUp之前检查权限
- 10. 在当前域名之外检查WordPress登录
- 11. 检查用户是否在模板加载之前登录
- 12. 检查用户仍在登录而不重置AUTH超时
- 13. ember简单auth:登录后重定向到之前的路由
- 14. 在登录事件之前
- 15. Github在推之前登录
- 16. Laravel 5.2使用Laravel Auth组件和AngularJS登录
- 17. Django Ajax Auth登录
- 18. 上将auth登录
- 19. Laravel auth检查字段是否为空
- 20. Laravel 4:如何在使用Auth登录时记住用户:登录
- 21. ASP.NET登录控制登录前检查多个数据库
- 22. 如何检查当前登录的用户和登录时间
- 23. 如何使用auth方法检查用户是否登录FORM
- 24. 如何在Laravel 5.0中使用Auth :: attempt无密码登录?
- 25. 验证登录节流不缺省auth在Laravel 5.2工作
- 26. Laravel Auth ::登录不能在AJAX请求上工作
- 27. 工匠化妆:AUTH登录失败
- 28. 之前登录操作
- 29. 登录Facebook之前iOS 9
- 30. 在插入新记录之前检查记录的存在
覆盖实现AuthenitacesUsers的类中的函数。 – devk
你可以为此做一个中间件? –