Laravel 5.6 にて認証処理をカスタマイズしております。
users テーブルにて、status という状態の項目を追加し、
1、または、4の場合のみログイン可能としたいと思っています。
以下の様にオーバーライドしておりますが、
statusはどの様に記述すれば良いでしょうか?
php
1 2 protected function credentials(Request $request) 3 { 4 $credentials = $request->only($this->username(), 'password'); 5 $credentials['status'] = 1; // 状態ステータス有効のみログイン可能 1 or 4 6 // 4のor 条件はどの様に追加しますか? 7 return $credentials; 8 9 } 10 11
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
いろいろ方法はありますが,標準の Auth::attempt()
を使う方法に乗るのであれば,UserProvider
を自分で実装する方法が一番きれいなのでお勧めしておきます。
- 方法: 認証 6.0 Laravel
- 継承するデフォルト実装: auth/EloquentUserProvider.php
LoginController::credentials()
をオーバーライドした上でこちらも実装してください。
- HTTP リクエストからクレデンシャル配列を取り出す責務 →
LoginController::credentials()
- クレデンシャル配列を使ってデータベースから取ってきてユーザオブジェクトまたはNULLを返す責務 →
UserProvider::retrieveByCredentials(array $credentials)
実装例 (PHP7.1以降向け)
PHP
1<?php 2 3declare(strict_types=1); 4 5namespace App\Auth; 6 7use Illuminate\Auth\EloquentUserProivder; 8use Illuminate\Contracts\Auth\Authenticatable; 9 10class StatusAwareEloquentUserProvider extends EloquentUserProivder 11{ 12 public function retrieveByCredentials(array $credentials): ?Authenticatable 13 { 14 if (!isset($credentials['email'])) return null; 15 16 return $this->newModelQuery() 17 ->whereEmail($credentials['email']) 18 ->whereIn('status', [1, 4]) 19 ->first(); 20 } 21}
PHP
1<?php 2 3declare(strict_types=1); 4 5namespace App\Providers; 6 7use App\Auth\AppUserProvider; 8use Illuminate\Support\Facades\Auth; 9use Illuminate\Foundation\Application; 10use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; 11 12class AuthServiceProvider extends ServiceProvider 13{ 14 public function boot(): void 15 { 16 $this->registerPolicies(); 17 18 Auth::provider('status_aware_eloquent', function (Application $app, array $config) { 19 return new StatusAwareEloquentUserProvider($app['hash'], $config['model']); 20 }); 21 } 22}
PHP
1 'providers' => [ 2 'users' => [ 3 'driver' => 'status_aware_eloquent', 4 'model' => App\User::class, 5 ], 6 ],
投稿2018/04/14 09:03
編集2019/10/16 09:37総合スコア5223
0
自己解決
以下のメソッドをオーバライドしました。
PHP
1 public function login(Request $request) 2 { 3 // 入力のバリデーション 4 $this->validateLogin($request); 5 6 // ログインに何回も失敗するとログインできなくなる仕組み 7 if ($this->hasTooManyLoginAttempts($request)) { 8 $this->fireLockoutEvent($request); 9 10 return $this->sendLockoutResponse($request); 11 } 12 13 // 実際のログインのチェック 14 if ($this->attemptLogin($request)) { 15 16 17 // この時点でログイン済みユーザの情報はAuthで保持されているが、 18 // リクエストインスタンスには存在しない 19 20//0:準備中、1:運用中、2:停止、3:解約、4:トライアル 21 22 $status = Auth::guard('clinic')->user()->status; 23 24 if ($status == 1 || $status == 4) { 25 //dd('ログイン成功', $status); 26 27 28 } else { 29 //dd('ログイン失敗', $status); 30 31 $this->logout($request); 32 33 34 // return redirect()->back() 35 // ->withInput() 36 // ->with('alert', 'アカウントが有効になっていません。確認メール中のリンクをクリックし、有効にしてください。'); 37 38 39 // ログイン失敗、なので試行回数をインクリメント 40 $this->incrementLoginAttempts($request); 41 42 // ログイン失敗のレスポンス生成 43 return $this->sendFailedLoginResponse($request); 44 45 } 46 47 48 // ログイン成功、以下はオリジナルコード 49 return $this->sendLoginResponse($request); 50 51 } 52 53 54 // ログイン失敗、なので試行回数をインクリメント 55 $this->incrementLoginAttempts($request); 56 57 // ログイン失敗のレスポンス生成 58 return $this->sendFailedLoginResponse($request); 59 60 61 } 62 63
投稿2018/06/02 05:26
総合スコア93
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/15 08:11 編集
2018/05/22 07:25