简体   繁体   English

Laravel 5.4,当用户不活跃时显示错误消息身份验证登录

[英]Laravel 5.4, show error message auth login when user not active

Im building auth process laravel 5.4 using default auth, my plan is I want to check some additional conditions 'user email must be activated' before log in, 我使用默认身份验证构建身份验证过程laravel 5.4,我的计划是在登录之前要检查一些其他条件“必须激活用户电子邮件”,

I have tried to override method attempLogin to my LoginController like this 我试图像这样将方法attempLogin覆盖到我的LoginController

protected function attemptLogin(Request $request)
{                
    $qLogin = [
        'user_email'        => $this->credentials($request)[$this->username()],
        'password'          => $this->credentials($request)[$this->password()],
        'active'            => 1
    ];        


    return $this->guard()->attempt(
        $qLogin, $request->has('remember')
    );
}

the code validate as my wish, but I want to display some error messages that tell the users, he/she must active / verify their email if they want to log in 该代码可以按照我的意愿进行验证,但是我想显示一些错误消息,告诉用户,如果他们要登录,他/她必须激活/验证他们的电子邮件

Sorry Im new for laravel, Your help will be wonderful 对不起,我是laravel的新用户,您的帮助会很棒

You can add credentials function to check if users are activated. 您可以添加凭据功能来检查用户是否被激活。 And you can modify the sendFailedLoginResponse function to customize your error message. 而且,您可以修改sendFailedLoginResponse函数以自定义错误消息。

Path: app\\Http\\Controllers\\LoginController 路径:app \\ Http \\ Controllers \\ LoginController

Remember to import Illuminate\\Http\\Request and App\\User(Here is App\\Models\\User because I moved my User model to App\\Models); 记住要导入Illuminate \\ Http \\ Request和App \\ User(这里是App \\ Models \\ User,因为我将User模型移到了App \\ Models);

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use App\Models\User;


class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    protected function credentials(Request $request) {
      return array_merge($request->only($this->username(), 'password'), ['active' => 1]);
    }

    /**
     * Get the failed login response instance.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    protected function sendFailedLoginResponse(Request $request)
    {
        $errors = [$this->username() => trans('auth.failed')];

        // Load user from database
        $user = User::where($this->username(), $request->{$this->username()})->first();

        // Check if user was successfully loaded, that the password matches
        // and active is not 1. If so, override the default error message.
        if ($user && \Hash::check($request->password, $user->password) && $user->active != 1) {
            $errors = [$this->username() => trans('auth.noactive')];
        }

        if ($request->expectsJson()) {
            return response()->json($errors, 422);
        }
        return redirect()->back()
            ->withInput($request->only($this->username(), 'remember'))
            ->withErrors($errors);
    }
}

By the way, I add a line in resources\\lang\\en\\auth.php so I can use trans('auth.notactivated') as my error message. 顺便说一句,我在resources \\ lang \\ en \\ auth.php中添加了一行,因此我可以使用trans('auth.notactivated')作为错误消息。

<?php

return [
    'failed' => 'These credentials do not match our records.',
    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
    'notactivated' => 'This account has not been activated yet.',
];

Nice one @ jack59074 The function "sendFailedLoginResponse" needs to be restructured as follows.. @ jack59074不错的一个功能“ sendFailedLoginResponse”功能需要按以下方式进行重组。

  protected function sendFailedLoginResponse(Request $request) { // Load user from database $user = User::where($this->username(), $request->{$this->username()})->first(); //dd($user); // Check if user was successfully loaded, that the password matches // and active is not 1. If so, override the default error message. if ($user && \\Hash::check($request->password, $user->password) && $user->status != 1) { $errors = [$this->username() => trans('auth.noactive')]; } if ($request->expectsJson()) { return response()->json($errors, 422); } return redirect()->back() ->withInput($request->only($this->username(), 'remember')) ->withErrors($errors); throw ValidationException::withMessages([ $this->username() => [trans('auth.failed')], ]); } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM