У меня установлен новый проект Laravel 5.6. Я изменил create_users_migration, добавил поле $table->boolean('is_active');. Теперь я хочу, когда пользователь пытается войти в систему, проверять, установлено ли в поле is_active значение true.

Я попытался переписать стандартный метод AuthenticatesUsers:

protected function validateLogin(Request $request)
{
    $this->validate($request, [
        $this->username() => 'required|string',
        'password' => 'required|string',
    ]);
}

После password я добавил строку 'is_active' => true,, и теперь, когда я нажимаю кнопку "Войти", она возвращает мне ошибку array_map(): Argument #2 should be an array.

Я попытался просто скопировать и вставить этот метод в LoginController, но он выдает ту же ошибку. Есть идеи, или может быть здесь другое решение?

Полный код LoginController:

<?php

namespace App\Http\Controllers\Auth;


use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

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 = '/';

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

    /**
     * Validate the user login request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            $this->username() => 'required|string',
            'password' => 'required|string',
            'is_active' => true,
        ]);
    }

}
0
priMo-ex3m 13 Мар 2018 в 14:01

2 ответа

Лучший ответ

Вы редактируете неправильный метод. Этот метод проверяет запрос, и «истина» не является правилом проверки, поэтому вы получаете сообщение об ошибке.

Вот простое решение. Переопределите метод учетных данных на вашем LoginController, как показано ниже.

protected function credentials(Request $request)
{
    $data = $request->only($this->username(), 'password');
    $data['is_active'] = true;
    return $data;
}

Таким образом, только активные пользователи могут войти в систему.

Вы также можете создать промежуточное ПО и использовать его для отправки пользователей, которые не активировали свою учетную запись, на страницу активации.

2
Farzin Farzanehnia 13 Мар 2018 в 11:09

Я сделал это для одного проекта с промежуточным ПО:

<?php

namespace App\Http\Middleware;

use Closure;

class isActiv
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if($request->user()->isActiv()){
            return $next($request);
        }else{
            return redirect()->route('dashboard')->with('errors', 'Votre compte utilisateur n\'est pas activé sur le site. Veuillez contacter un administrateur pour résoudre le problème.');
        }
    }
}

Затем в моем файле маршрута web.php:

Route::group(['middleware' => ['isActiv'] ], function(){

И в моей пользовательской модели:

public function isActiv(){
    if($this->is_activ == 1 || $this->is_admin == 1){
      return true;
    }
    return false;
  }
-1
kevinniel 13 Мар 2018 в 11:24