2

質問があります。私は現在、Laravel 5.3の小さなサイトを開発しており、ユーザーから登録してログインするためのBasic Authを使用しています。Laravel 5.3 Authブロックユーザー

誰もが登録してログインできますが、ボタンをクリックすると(管理者として)、特定のユーザーをブロックすることができます(たとえば、何か許可されていない場合など)。データベース内の行を完全に削除するのではなく、ユーザーがログインしようとすると「これ以上ログインできなくなったり、アカウントがブロックされたり、詳細情報が必要な場合は管理者に連絡する」などのメッセージが表示されます。類似。問題は、これを行うにはどうすればよいでしょうか?私は何かが組み込まれていない、私が間違っている場合私を修正します... 私はちょうどユーザーテーブルを変更し、 "ブロック"と呼ばれる列を追加することができます、通常はfalseに設定し、 trueにしてから、何らかの方法でこの値をチェックし、このメッセージを表示してログインを許可しない(もしそうなら)場合は、これを行うのが最良の方法ですか?はいの場合は、この値をどこで確認する必要がありますか、どのようにメッセージを表示できますか?そうでない場合は、より良い方法は何ですか?

答えて

2

私はすぐに使えるログイン機能を自分のLoginControllerに移して少し追加しました。私のログイン方法は、次のようになります。

/** 
* Handle a login request to the application. 
* 
* @param \Illuminate\Http\Request $request 
* @return \Illuminate\Http\Response 
*/ 
public function login(Request $request) 
{ 
    $this->validateLogin($request); 

    $user = User::where('email', $request->email)->firstOrFail(); 
    if ($user && !$user->active) { 
     return $this->sendLockedAccountResponse($request); 
    } 

    if ($this->hasTooManyLoginAttempts($request)) { 
     $this->fireLockoutEvent($request); 

     return $this->sendLockoutResponse($request); 
    } 

    if ($this->attemptLogin($request)) { 
     return $this->sendLoginResponse($request); 
    } 

    $this->incrementLoginAttempts($request); 

    return $this->sendFailedLoginResponse($request); 
} 

私もアクティブでなかったユーザーを処理するために、これらの機能を追加しました:

/** 
* Get the locked account response instance. 
* 
* @param \Illuminate\Http\Request $request 
* @return \Illuminate\Http\Response 
*/ 
protected function sendLockedAccountResponse(Request $request) 
{ 
    return redirect()->back() 
     ->withInput($request->only($this->loginUsername(), 'remember')) 
     ->withErrors([ 
      $this->loginUsername() => $this->getLockedAccountMessage(), 
     ]); 
} 

/** 
* Get the locked account message. 
* 
* @return string 
*/ 
protected function getLockedAccountMessage() 
{ 
    return Lang::has('auth.locked') 
      ? Lang::get('auth.locked') 
      : 'Your account is inactive. Please contact the Support Desk for help.'; 
} 
+0

答えをありがとう。あなたが投稿したものを見ていますが、どうすれば自分のコントローラにすぐにログイン機能を移して、代わりに私がrpvoideを使用するのですか? – nameless

+0

AuthControllerは、 'Illuminate \ Foundation \ Auth \ AuthenticatesUsers'からログインメソッドを継承します。そのクラスのログインメソッドをAuthControllerにコピーすると、Laravelは代わりにAuthControllerバージョンを使用します。あなたのニーズに合わせて修正することができます。 (これはLaravel 5.2のものですが、これらのクラス名は5.3と同じです) – jackel414

+0

しかしAuthControllerとは何ですか?私が作成するだけの新しいコントローラ?それはいつ呼び出されますか?申し訳ありませんが少し混乱しています – nameless

0

soft deleting機能を使用できます。

実際にデータベースからレコードを削除するだけでなく、Eloquentはモデルを「ソフト削除」することもできます。モデルをソフト削除すると、実際にはデータベースから削除されません。代わりに、deleted_at属性がモデルに設定され、データベースに挿入されます。モデルにnullでないdeleted_at値があるモデルは、ソフト削除されています。 。ログイン時にこの値をチェックするために、私は過去に似た何かをやったときに、ユーザーがログインすることができるはずかどうかを示すためにblockedまたはactive列を使用 - 私はあなたが示唆されているものだろう

+1

は実際に私が言った同じですが、ちょうどその代わり、 'blocked'という列の' deleted_at'属性であることでしょう。..また、私は完全にデータベース内の何かを削除したいかもしれないので、それは私が推測したいものではありません – nameless

+0

@無名のソフト削除はまさにあなたが探しているものです。それは 'forceDelete()'、 'withTrashed()'、 'trashed()'、 'restore()'などの必要なメソッドをすべて既に持っています。また、 'blocked 'ユーザを通常の' get() '、' paginate () 'などのクエリを実行します。 –

+0

ソフト削除を有効にして、私が望んでいれば私はまだ完全にユーザーを削除できますか?そして、どうすれば(ユーザーがソフト削除された場合)、ログイン時にメッセージを表示することができますか? – nameless

-2

を解決:このリンク(チュートリアル)がお手伝いします:https://medium.com/@mshanak/solved-tutorial-laravel-5-3-disable-enable-block-user-login-web-passport-oauth-4bfb74b0c810

STEP1:

add new field to the User table called ‘status’ (1:enabled, 0:disabed) 

STEP2:

to block the web login , in app/Http/Controllers/Auth/LoginController.php add the follwoing function: 

/** 
* Get the needed authorization credentials from the request. 
* 
* @param \Illuminate\Http\Request $request 
* @return array 
*/ 
protected function credentials(\Illuminate\Http\Request $request) 
{ 
$credentials = $request->only($this->username(), ‘password’); 

return array_add($credentials, ‘status’, ‘1’); 
} 

ステップ3:

to block the user when using passport authentication (token) , in the User.php model add the following function : 

public function findForPassport($identifier) { 
    return User::orWhere(‘email’, $identifier)->where(‘status’, 1)->first(); 
    } 

が:)完了

+0

潜在的なソリューションへのリンクはいつでも歓迎しますが、[リンクの前後にコンテキストを追加](http://meta.stackexchange.com/a/8259)して、仲間のユーザーには何か、その理由。ターゲットサイトに到達できない場合や、永続的にオフラインになる場合は、常に重要なリンクの最も関連性の高い部分を引用してください。外部サイトへのリンク以上になることは、[なぜ、どのように答えが削除されるのか?](http://stackoverflow.com/help/deleted-answers)という理由が考えられます。 – FelixSFD

0

STEP1:

add new field to the User table called ‘status’ (1:enabled, 0:disabed) 

STEP2:

to block the web login , in app/Http/Controllers/Auth/LoginController.php add the follwoing function: 

/** 
* Get the needed authorization credentials from the request. 
* 
* @param \Illuminate\Http\Request $request 
* @return array 
*/ 
protected function credentials(\Illuminate\Http\Request $request) 
{ 
$credentials = $request->only($this->username(), ‘password’); 

return array_add($credentials, ‘status’, ‘1’); 
} 

ステップ3:

to block the user when using passport authentication (token) , in the User.php model add the following function : 

public function findForPassport($identifier) { 
    return User::orWhere(‘email’, $identifier)->where(‘status’, 1)->first(); 
    } 

このリンク(チュートリアル)を参照のお手伝いを致します:https://medium.com/@mshanak/solved-tutorial-laravel-5-3-disable-enable-block-user-login-web-passport-oauth-4bfb74b0c810

関連する問題