Проверьте дополнительное поле пользователя при входе в систему с помощью аутентификации Laravel по умолчанию - PullRequest
0 голосов
/ 15 мая 2019

У меня есть следующие миграции:

Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('company_id')->unsigned();
            $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
            $table->boolean('enable')->default(0);
            $table->string('name', 120)->nullable();
            $table->string('surname', 120)->nullable();
            $table->string('email', 120)->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->bigInteger('counter')->default(0);
            $table->string('url_address', 160);
            $table->string('ip', 25)->nullable();
            $table->boolean('isCompany')->default(0);
            $table->boolean('isMailing')->default(0);
            $table->text('content')->nullable();
            $table->string('nip1', 12)->nullable();
            $table->string('business1', 120)->nullable();
            $table->string('phone1', 60)->nullable();
            $table->string('street1', 150)->nullable();
            $table->string('number1', 8)->nullable();
            $table->string('postal_code1', 12)->nullable();
            $table->string('city1', 100)->nullable();
            $table->bigInteger('country_id1')->default(0);
            $table->bigInteger('provincial_id1')->default(0);
            $table->string('nip2', 12)->nullable();
            $table->string('business2', 120)->nullable();
            $table->string('phone2', 60)->nullable();
            $table->string('street2', 150)->nullable();
            $table->string('number2', 8)->nullable();
            $table->string('postal_code2', 12)->nullable();
            $table->string('city2', 100)->nullable();
            $table->bigInteger('country_id2')->default(0);
            $table->bigInteger('provincial_id2')->default(0);
            $table->string('nip3', 12)->nullable();
            $table->string('business3', 120)->nullable();
            $table->string('phone3', 60)->nullable();
            $table->string('street3', 150)->nullable();
            $table->string('number3', 8)->nullable();
            $table->string('postal_code3', 12)->nullable();
            $table->string('city3', 100)->nullable();
            $table->bigInteger('country_id3')->default(0);
            $table->bigInteger('provincial_id3')->default(0);
            $table->decimal('cash', 9, 2)->default(0);
            $table->decimal('lng', 10, 8)->default(0);
            $table->decimal('lat', 10, 8)->default(0);
            $table->boolean('enable_map')->default(0);
            $table->rememberToken();
            $table->timestamps();
            $table->engine = "InnoDB";
        });

У меня есть 2 вопроса в связи с входом в Laravel:

  1. Я хочу войти в системутолько если пользователь имеет enable = 1

  2. Параметр enable является значением по умолчанию, равным 0. После нажатия на ссылку активации в письме я хотел бы изменить enable = 0 при enable = 1

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 16 мая 2019

При вызове метода attempt() вы можете передать массив учетных данных, которые можно использовать.

Вы можете сделать, как упоминалось ранее, и создать свои собственные контроллеры, но если вы используете леса авторизации, поставляемые с laravel (включая auth:make и классы в app/Http/Controllers/Auth), вы можете просто отредактировать файл:

app/Http/Controllers/Auth/LoginController.php

Здесь вы хотите переопределить метод учетных данных, добавив следующее:

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

Это означает, что, когда остальная часть кода запускается автоматически, массив credentails будет выглядеть примерно так:

array(
    'username' => 'theusername',
    'password' => 'thepassword',
    'active'   => 1
)

Ранее упоминалось, что вы должны привести свой атрибут к логическому значению, но это не так. Миграции Laravel создают крошечный столбец int вместо логического значения, и приведение работает только при работе с моделями. Поскольку этот массив используется для генерации условий, в которых выполняется запрос к БД, приведение не будет работать, поскольку значение в БД будет 1, а не true.

0 голосов
/ 16 мая 2019

Для этого вам нужно создать собственный контроллер входа и справиться с этой ситуацией. Я упоминаю это подробно, проверьте меня ниже приведенных шагов.

  1. Обновите ваши маршруты / web.php

    Route::get('/', function () {
       return redirect(route('login'));
    });
    Route::get('/home', 'HomeController@index')->name('home');
    
    Route::post('/authenticate', 'LoginController@authenticate')->name('authenticate');
    Route::get('/logout', '\App\Http\Controllers\Auth\LoginController@logout');
    
    1. Создание приложения / Http / Controllers / LoginController.php

и добавьте этот метод в этот контроллер

 /**
     * Handle an authentication attempt.
     *
     * @param  \Illuminate\Http\Request $request
     *
     * @return Response
     */
    public function authenticate(Request $request)
    {
        //ADD VALIDATION CODE HERE

        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            // Authentication passed...
            return redirect()->intended('dashboard');
        }
    }
  1. Итак, я упомянул вышеупомянутый метод "// ДОБАВИТЬ КОД ВАЛИДАЦИИ ЗДЕСЬ "в этом месте вы должны подтвердить запрос и сделать запрос, чтобы убедиться, что пользователь включен или нет.

Надеюсь, это сработает для вас.

0 голосов
/ 15 мая 2019

Вам придется переопределить контроллеры и маршруты по умолчанию.

Сначала удалите аутентификационные маршруты, поскольку вы собираетесь создать их самостоятельно.

Затем определите ваши контроллеры.

Для части входа в систему вы можете создать свой собственный контроллер входа в систему и сделать свою собственную попытку входа в систему, которую использует Laravel. Там вы можете добавить свой желаемый атрибут проверки, как это.

public function login(Request $request)
{
    //Validate your form data here
    $request->validate([
        'email' => ['required', 'string'],
        'password' => ['required', 'string'],
    ]);

    //Create your own login attempt here
    $login_atempt = Auth::attempt([
        'email' => $request->email,
        'password' => $request->password,
        'enabled' => true //or 1 , I recommend you to cast your attribute to boolean in your model
    ], $request->filled('remember'));

    if ($login_atempt) {
        $request->session()->regenerate();

        return redirect()->route('home'); //Your home screen route after successful login
    }

    //using custom validation message as Laravel does
    throw ValidationException::withMessages([
        'email' => [trans('auth.failed')],
    ]);
}

также добавьте простой метод для вызова формы входа в систему.

public function showLoginForm()
{
    return view('auth.login');
}

Тогда ваши маршруты (я назвал свой контроллер, UserLoginController)

Route::group(['middleware' => 'guest'], function () {
    Route::get('/login', 'UserLoginController@showLoginForm')->name('login.index');
    Route::post('/login', 'UserLoginController@login')->name('login');
});

По второму вопросу документации Laravel говорится

После проверки адреса электронной почты пользователь будет автоматически перенаправлен на / home. Вы можете настроить местоположение перенаправления после проверки, определив метод или свойство redirectTo в VerificationController:

protected $redirectTo = '/dashboard';

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

Для завершения убедитесь, что вы вручную добавили нужные вам маршруты авторизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...