Перенаправить, если аутентифицированная логика во встроенной auth Laravel?
этот вопрос задавался раньше, и я считаю, что мой код верен, но я получаю странное поведение.
мне нужно перенаправить пользователя на различных маршрутах после входа в систему в зависимости от некоторых значений базы данных. Я думал, что для этого мне просто нужно поместить свою логику в handle
метод app/Http/Middleware/RedirectIfAuthenticated.php
. Мой метод в настоящее время выглядит так:
public function handle($request, Closure $next)
{
if ($this->auth->check()) {
if($this->auth->user()->sign_up_complete == 1){
return redirect('/');
} else {
if($this->auth->user()->step_one_complete == 0){
return redirect('/register/step-1');
} elseif($this->auth->user()->step_two_complete == 0){
return redirect('/register/step-2');
} else {
return redirect('/');
}
}
}
return $next($request);
}
это не работает, и при входе в систему пользователь перенаправляется на /home
. Я пробовал разместить dd($this->auth->user())
внутри $this->auth->check()
состояние, но он никогда не запускается. Если я помещаю его вне этой проверки, то он запускается по каждому запросу. Похоже на $this->auth->check()
никогда не выполняется.
мой вопрос: если не здесь, то куда должна идти эта логика?
Я удалил protected $redirectTo = '/account';
С тоже.
5 ответов
вы неправильно используете промежуточное ПО. Этот фрагмент кода будет срабатывать каждый раз, когда вы отправляете запрос при входе в систему.
изменить расположение перенаправления после входа в систему вы можете переопределить redirectPath()
метод в AuthController. (Вы можете найти исходный метод в vendor/laravel/framework/src/Illuminate/Foundation/Auth/RedirectsUsers.php
)
это будет выглядеть так:
...
public class AuthController extends Controller {
...
public function redirectPath()
{
if(Auth::user()->sign_up_complete == 1) {
return '/';
} else {
if(Auth::user()->step_one_complete == 0) {
return '/register/step-1';
} elseif(Auth::user()->step_two_complete == 0) {
return '/register/step-2';
} else {
return '/';
}
}
}
// The rest of the class implementation.
}
примечание: Я заменил $this->auth()
метод с альтернативой фасада (Auth::
). Просто потому что я не конечно, если AuthController имеет auth()
метод.
Я думаю, что это так просто, как настройка пользовательского промежуточного класса для проверки ваших запросов на основе значений базы данных, я делаю это для исключения пользователей без правильной роли.
роль определена в моей таблице пользователей, и доступ к системе разрешен только пользователям с ролью администратора.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\MessageBag;
class RolesMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// If a user is authenticated
if(\Auth::user() != null)
{
// If the user doesn't have the correct role
if(\Auth::user()->role != 'administrator')
{
// logout the user
\Auth::logout();
// create a new MessageBag
$messageBag = new MessageBag;
// add a message
$messageBag->add('not_allowed', 'You are not allowed to login, because you do not have the right role!');
// redirect back to the previous page with errors
return \Redirect::to('login')->withErrors($messageBag);
}
}
return $next($request);
}
}
решение в ответ Марк Валет, но нуждаются в небольшой коррекции. Возврат должен быть строкой:
public class AuthController extends Controller {
...
public function redirectPath()
{
if(Auth::user()->sign_up_complete == 1) {
return '/';
} else {
if(Auth::user()->step_one_complete == 0) {
return '/register/step-1';
} elseif(Auth::user()->step_two_complete == 0) {
return '/register/step-2';
} else {
return '/';
}
}
}
// The rest of the class implementation.
}
u не может изменить основные файлы laravel все, что вам нужно сделать, это добавить этот код в Auth\AuthController
protected $redirectPath = '/dashboard';
чтобы понять, почему ваша логика маршрутизации никогда не достигается, вы должны посмотреть в app/Http/Kernel.php
где зарегистрировано промежуточное ПО RedirectIfAuthenticated:
protected $routeMiddleware = [
...
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
...
];
это означает, если пользователь переходит к маршруту, который не защищен guest
промежуточное ПО маршрута, запрос никогда не проходит через класс RedirectIfAuthenticated и поэтому полностью пропускает вашу логику.
вы можете добавить гостевое промежуточное ПО к вашим маршрутам регистрации в файле маршрутов, чтобы заставить маршрутизацию чтобы пройти через ваш код следующим образом:
Route::get('/register/step-1', '<YOUR CONTROLLER METHOD>')->middleware('guest');
но, поскольку вы говорите, что пользователь уже вошел в систему (не гость), вы должны вместо этого переместить свой код, как предложено другими ответами.
только добавив это в качестве ответа, потому что это не может быть разъяснено в пространстве, разрешенном комментарием.