Ошибка перенаправления при использовании двух страниц входа в Laravel - PullRequest
0 голосов
/ 06 июля 2018

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

Мобильный логин использует идентификатор и пароль, а оригинал - адрес электронной почты и пароль.

Таким образом, я сделал мобильную страницу включающей в себя простую форму входа в систему, которая включает в себя всего две кнопки, названные как In / Out, и цель действия этой формы такая же, как и у исходного маршрута входа Laravel Auth ('/ login') для использования проверки входа в систему.

Поэтому я добавил код ниже, чтобы использовать другую страницу входа в Http / Auth / LoginController.

//Http/Auth/LoginController

public function username()
{
    if(request('id')) {
        return 'id'; // if request contains id in mobile then return it
    }
    return 'email'; // else return email
}

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

protected function authenticated(Request $request, $user)
{
    if ($request->in == 'in') {
        return redirect()->route('mobiles_start', ['in' => 'in']);
    } // route('mobiles_start') is target to logic controller 
      // and after worked then return to mobile login view.

    elseif ($request->out == 'out') {
        return redirect()->route('mobiles_destroy', ['out' => 'out']);
    } // route('mobile_destroy) also.
}

public function showLoginForm(Request $request)
{
    if ($request->in == 'in' || $request->out == 'out') {
        return view('mobiles.login');
    }

    else return view('auth.login');
}

Но проблема в том, что если на странице входа в систему с мобильного устройства произошел сбой, то всегда перенаправляйте на исходную страницу входа ('auth.login'), а не на мобильную.

Как я могу сделать перенаправление страницы мобильного входа в систему?

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Перенаправление для неудачной / отсутствующей аутентификации определено в Illuminate\Foundation\Exceptions\Handler.php

/**
 * Convert an authentication exception into a response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Auth\AuthenticationException  $exception
 * @return \Illuminate\Http\Response
 */
protected function unauthenticated($request, AuthenticationException $exception)
{
    return $request->expectsJson()
                ? response()->json(['message' => $exception->getMessage()], 401)
                : redirect()->guest(route('login'));
}

Интересующие вас функции: unauthenticated() и invalid().

В зависимости от местоположения вашей платформы вы можете переопределить их в App\Exceptions\Handler.php, тем самым управляя потоком неудачных аутентификации и перенаправления.

Надеюсь, это поможет.

0 голосов
/ 06 июля 2018

Попробуйте переопределить черту sendFailedLoginResponse из AuthenticatesUsers.

Добавьте это в свой LoginController.

use Illuminate\Validation\ValidationException;

protected function sendFailedLoginResponse(Request $request)
{
    $validationException =  ValidationException::withMessages([
        $this->username() => [trans('auth.failed')],
    ]);

    if ($request->in == 'in' || $request->out == 'out') {
        return $validationException->redirectTo('mobile/url');
    }
    return $validationException->redirectTo('auth/url');
}

Обратите внимание, что redirectTo принимает URL , а не имя вида или маршрута.

0 голосов
/ 06 июля 2018

Вам необходимо перезаписать sendFailedLoginResponse в этом контроллере входа в систему.

Код для Laravel 5.3:

protected function sendFailedLoginResponse(Request $request)
    {
        return redirect()->back()
            ->withInput($request->only($this->username(), 'remember','in','out'))
            ->withErrors([
                $this->username() => Lang::get('auth.failed'),
            ]);
    }

Код для Laravel 5.5 (аналогично посту Wreigh):

protected function sendFailedLoginResponse(Request $request)
{
   if ($request->in == 'in' || ) {
        throw ValidationException::withMessages([
            $this->username() => [trans('auth.failed')],
        ])->redirectTo('/login?in=in');
   } else if($request->out == 'out'){
        throw ValidationException::withMessages([
            $this->username() => [trans('auth.failed')],
        ])->redirectTo('/login?out=out');
   } else {
        throw ValidationException::withMessages([
            $this->username() => [trans('auth.failed')],
        ]);
   }
}

Поскольку оригинальный sendFailedLoginResponse перенаправляет только назад с именем пользователя и запоминает параметры, добавление и удаление заставит его работать, я верю.

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

Кроме того, я бы использовал лучшую структуру, чтобы определить, была ли она с мобильного входа или с обычной страницы входа. Например, присвоение переменной типа is_mobile_login сделает код более читабельным.

Надеюсь, это поможет.

0 голосов
/ 06 июля 2018

Я предполагаю, что маршрут 'mobiles_destroy' ведет к неправильному методу. Проверьте перенаправление с этого метода.

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