【问题标题】:Middleware redirecting loop error in LaravelLaravel 中的中间件重定向循环错误
【发布时间】:2020-07-06 10:22:30
【问题描述】:

我正在尝试根据用户在注册页面中输入的角色来重定向用户,但是我不断收到“重定向太多次”错误。我认为这是因为我在主页上同时使用了 auth 和 guest mddlewares 但是我似乎无法修复它

Web.php:

Route::get('/', function () {
    return view('auth.login');
});

Auth::routes();

// Using middleware guest (Redirect If Authenticated) to check role and redirect to right route.
Route::middleware(['guest'])->group(function(){
    Route::get('/home', 'HomeController@index')->name('home');
});


Route::prefix('referrer')->group(function(){

    /* need a more advanced middleware to give a notification when a brand user hits the
    *  referrer register/login page.
    *  e.g. logout and switch account, or simply make the referrer auth pages not accessible.
    */

    Route::get('/login/{program_id?}', 'ReferrerController@showLoginForm')->name('referrer.login')->middleware('guest');
    Route::post('/login/{program_id?}', 'Auth\LoginController@login')->name('referrer.login.user');
    Route::get('/', 'ReferrerController@getHome')->name('referrer.home')->middleware('auth');
    
//program middieware
    Route::middleware(['program.exist'])->group(function(){
        Route::get('/register/{program_id?}', 'ReferrerController@showRegistrationForm')->name('referrer.register');
        Route::post('/register/{program_id?}', 'ReferrerController@register')->name('referrer.register.user');
    });
});

注册控制器:

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    // protected $redirectTo = RouteServiceProvider::HOME;

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

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'role' => ['required', 'integer', 'between:1,3'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        $user = User::create([
            'name' => $data['name'],
            'role_id' => $data['role'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);

        return $user;
    }

    protected function redirectTo() {
        $role = auth()->user()->role_id;

        switch ($role) {
            case '3':
                return RouteServiceProvider::REF_HOME;
                break;
            case '1':
            //temp set as brand home
                return RouteServiceProvider::ADMIN_HOME;
                break; 
            default:
                return RouteServiceProvider::HOME;
                break;
        }
    }

}

家庭控制器:

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function index()
    {
        return view('home');

RedirectIfAuthenticated 中间件:

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
       
        if (Auth::guard($guard)->check()) {
             // User role
             $role = Auth::user()->role->name;

             switch ($role) {
                 //role_id = 3
                 case 'referrer':
                     return redirect(RouteServiceProvider::REF_HOME);
                     break;
                //role_id = 1
                 case 'admin':
                 //temp set as brand home
                     return redirect(RouteServiceProvider::ADMIN_HOME);
                     break; 
                 default:
                     return redirect(RouteServiceProvider::HOME);
                     break;
             }

        }

        return $next($request);
    }

}

【问题讨论】:

  • 你不能在同一条路径上使用authguest 中间件......因为它们是否经过身份验证,所以某人无法通过这两个中间件,所以人们总是会把它们重定向走......说过永远不应该有一段时间你会认为你需要两者,因为这是不可能的
  • @lagbox 我该如何解决这个问题,我已经尝试删除一些代码,但它仍然不起作用

标签: php laravel redirect


【解决方案1】:

您在 HomeController 中的 index 函数有 auth 和 guest 中间件,只使用其中一个即可。

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 2020-02-19
    • 1970-01-01
    • 2018-05-28
    • 2016-03-16
    • 2014-06-02
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多