2017-02-22 93 views
1

我使用Laravel 5.4及其内置的Auth API。我在users表中添加了一个名为is_admin的列。我想修改登录过程,以便登录仅在is_admin == 1时有效。我查看了Illuminate\Foundation\Auth\AuthenticatesUsers.phpGithub),我可能会在那里做一些改变,但如果可能的话,我宁愿不打扰核心。有没有更优雅的方式来做到这一点?Laravel auth在登录之前检查列

+0

覆盖实现AuthenitacesUsers的类中的函数。 – devk

+0

你可以为此做一个中间件? –

回答

0

我解决这与类似@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现在只有用户也将登录

0

您可以创建你的登录功能:

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

因此,在您登录功能,你可以通过检查这谢谢

0

我认为一个更好的方法是实际上允许所有用户登录。然后通过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 
    ]; 
+0

谢谢。你说你认为这更好 - 为什么(只是好奇)?例如,我的意思是为什么不创建一个名叫“admin”的新卫队。 – GluePear

+0

@GluePear好的,一名警卫也可以解决这个问题。但是,如果使用'admin'后卫,那么假设使用相同的'session'驱动程序,则需要创建整个'admins'表和模型。我认为将用户保存在一张表中是一种很好的做法,因此随着应用程序的增长,您只需添加权限/角色。所以是使用警卫是一种解决方案。但在这种情况下,我会说这是相当大胆,然后优雅。 –

+0

@GluePear我还会补充一点,有时候有几个用户表也可以。例如,当你让后台站点只能用于管理员时。但认为它仍然可以在一张桌子内完成。听到其他方法会很高兴 –

0

就像你提到的,你永远不应该触及核心文件。但是如果你能看到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 
    ]; 
} 
+0

有趣。我不知道这是否比我的回答更好(在LoginController中重写'attemptLogin')。 – GluePear

0

该解决方案可能不够优雅,但仍然有效。

一下添加到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 

也请记住,你应该禁用寄存器功能,因为注册用户仍登录后。