質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

1304閲覧

Laravel での認証処理のカスタマイズについて。

hrsi_teratail

総合スコア93

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

2クリップ

投稿2018/04/10 16:53

編集2018/04/14 05:22

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

いろいろ方法はありますが,標準の Auth::attempt() を使う方法に乗るのであれば,UserProvider を自分で実装する方法が一番きれいなのでお勧めしておきます。

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
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hrsi_teratail

2018/05/15 08:11 編集

すいません、単純でいいのですが、credentialsの中で処理を判定させたいのですが、可能でしょうか? $credentials['status'] = 1or 4; のようなイメージです。
mpyw

2018/05/22 07:25

それが不可能なのでこの回答をさせていただいたまでです。
guest

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

hrsi_teratail

総合スコア93

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問