2017-02-22 5 views
1

私はLaravel 5.4とそのAuth APIを使用しています。 is_adminという表にusersという表に列を追加しました。 is_admin == 1の場合にのみログインが動作するようにログインプロセスを変更したいと思います。私はIlluminate\Foundation\Auth\AuthenticatesUsers.phpGithub)を見ましたが、おそらくそこに変更を加えることができましたが、できるだけコアを乱すことはありません。これを行うよりエレガントな方法はありますか?ログイン前にLaravelの認証を確認する

+0

AuthenitacesUsersを実装する独自のクラスの関数をオーバーライドします。 – devk

+0

これはおそらくミドルウェアを作ることができますか? –

答えて

0

これは@Sagarに似た解決策でアローラの。 artisan make:authを実行したときに作成されたapp\Http\Controllers\Auth\LoginController.phpには、メソッドをAuthenticatesUsersから上書きしました。これは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ミドルウェア経由でアクセスを制限する。この方法で、このミドルウェアを好きなだけ多くのルートに適用することができます。

あなたがapp\Http\Middleware\RedirectIfNotAdminを作成

Route::group(['middleware' => 'admin'], function() { 
    // auth protected routes 
}); 

この方法でラップする必要経路でそれを使用してください:app\Http\Kernel.phpで次に

<?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('/'); 
    } 
} 

あなたは$routeMiddlewareプロパティに追加します:私は解決

protected $routeMiddleware = [ 
     // ... other middlewares 
     'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class 
    ]; 
+0

ありがとうございます。あなたはこれがより良いと思うと言う - なぜ(好奇心が強い)?つまり、「管理者」と呼ばれる新しいガードを作成しないといけないのです。 – GluePear

+0

@GluePearはい、ガードもこれを解決する可能性があります。しかし、 'admin'ガードを使用している場合は、同じ' session'ドライバを使用すると仮定すると、 'admins'テーブルとモデル全体を作成する必要があります。私は、1つのテーブルにユーザーを置くことは良い習慣だと思うので、アプリケーションが大きくなるにつれてアクセス許可/ロールを追加するだけです。だからガードを使用することは解決策です。しかし、この場合、私はそれがむしろ大胆でエレガントだと言うでしょう。 –

+0

@GluePearまあ、私はまた時にはいくつかのユーザーテーブルを持っていることもOKですが追加します。たとえば、管理者だけが利用できるバックオフィスサイトを言うとします。しかし、それはまだ1つのテーブル内で行うことができると思っています。 –

0

あなたが言及しただけのように、あなたはコアファイルには触れてはいけません。しかし、もしlaravelがAuthenticatesUsersをLoginControllerに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 

はまた、あなたが登録機能を無効にする必要がありますことを、心に留めておきます。

関連する問題