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

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

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

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

Q&A

解決済

3回答

1816閲覧

laravel5.5のauth認証の条件拡張

rikumaro

総合スコア12

Laravel 5

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

0グッド

0クリップ

投稿2019/06/27 05:51

前提・実現したいこと

laravel5.5のauth認証の条件拡張をしたいです。
delete_flg = 0
start_date > today

この条件を追加したいのですが、start_dateの比較演算子を = から > に変更することが出来ません。
どこを修正すればよろしいでしょうか。

該当のソースコード

protected function credentials(Request $request) { return array_merge($request->only($this->username(), 'password'), ['delete_flg' => '0','start_date' => Carbon::today()]); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

m.ts10806

2019/06/27 07:01

私が不勉強なだけかもしれませんが、提示のコードだけではauthの機能を使っているようには見受けられません。 もう少し全体の流れが分かるコードとしてご提示いただけませんか?
guest

回答3

0

それが使われるのは\Illuminate\Auth\EloquentUserProvider::retrieveByCredentialsですが、処理が以下のようになっていて$query->where($key, $value);の形で条件を設定するだけなので、このままでは=の条件でしか設定できません。

php

1 /** 2 * Retrieve a user by the given credentials. 3 * 4 * @param array $credentials 5 * @return \Illuminate\Contracts\Auth\Authenticatable|null 6 */ 7 public function retrieveByCredentials(array $credentials) 8 { 9 if (empty($credentials) || 10 (count($credentials) === 1 && 11 array_key_exists('password', $credentials))) { 12 return; 13 } 14 15 // First we will add each credential element to the query as a where clause. 16 // Then we can execute the query and, if we found a user, return it in a 17 // Eloquent User "model" that will be utilized by the Guard instances. 18 $query = $this->createModel()->newQuery(); 19 20 foreach ($credentials as $key => $value) { 21 if (! Str::contains($key, 'password')) { 22 $query->where($key, $value); // ←この部分 23 } 24 } 25 26 return $query->first(); 27 } 28

従って、EloquentUserProviderをもとにカスタムユーザープロバイダを作成してそれを使うようにするのが正攻法だと思います。EloquentUserProviderを継承したクラスでretrieveByCredentialsを置き換えるぐらいで作成できるでしょう。

また、他の部分にも影響するのでここだけの問題ではなくなりますが、start_dateについての条件をグローバルスコープで設定してしまう方法もあると思います。

投稿2019/06/27 07:34

crhg

総合スコア1175

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

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

0

ベストアンサー

認証のカスタムガードを作成すると良いです。
EloquentUserProviderを継承して、retrieveByCredentialsをオーバーライドします。
Laravel 5.8 認証 カスタムガードの追加

以下の質問を参考にしてください。
Laravel での認証処理のカスタマイズについて。

投稿2019/06/27 07:12

aro10

総合スコア4106

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

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

0

解決済みですが,気軽に導入できるパッケージを作成したので宣伝がてら投稿します。

mpyw/scoped-auth: Apply specific scope for user authentication.

php

1<?php 2 3namespace App; 4 5use Illuminate\Auth\Authenticatable; 6use Illuminate\Contracts\Auth\Authenticatable as UserContract; 7use Illuminate\Database\Eloquent\Builder; 8use Illuminate\Database\Eloquent\Model; 9use Mpyw\ScopedAuth\AuthScopable; 10 11class User extends Model implements UserContract, AuthScopable 12{ 13 use Authenticatable; 14 15 public function scopeForAuthentication(Builder $query): Builder 16 { 17 return $query 18 ->where('start_date', '>', Carbon::today()) 19 ->where('delete_flg', '=', 0); 20 } 21}

投稿2019/12/12 06:01

mpyw

総合スコア5223

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

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

mpyw

2019/12/12 06:03

注意: 5.8 以上( EloquentUserProvider が 5.7→5.8 でリファクタリングされているため)
退会済みユーザー

退会済みユーザー

2019/12/12 06:04

ここで+1するより、スターつけたほうがいいですよね。
mpyw

2019/12/12 06:10

ありがとうございますw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問