首页 > 解决方案 > 基于用户角色的 Laravel 登录重定向问题:重定向太多次

问题描述

我正在尝试使用中间件在 Laravel 中编写代码,该中间件将根据用户的角色重定向用户。问题是我收到错误:无论用户是简单用户还是管理员,都重定向了太多次。到目前为止,我正在通过在中间件中提供字符串来检查用户是否是管理员,我还没有访问数据库。任何帮助是极大的赞赏。

下面是我的代码:

mid.php(中间件)

class mid
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if($request->session()->has('user')){
            $user = $request->session()->get('user');
            if($user == "pujan@pujanovic.com"){
                return redirect()->route('adminview');      
            }else{
                return redirect()->route('userview');      
            }
        }else{
            return redirect()->route('login')->with('poruka','Niste administrator!');
        }
        
        return $next($request);
    }
}

网页.php

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get("/","HomeController@index")->name('index');
Route::get("/login","HomeController@loginview")->name('login');
Route::get("/admin","HomeController@adminview")->name('adminview')->middleware('mid');


Route::post("/login","LoginController@login");

Route::get("/user","HomeController@userview")->name('userview')->middleware('mid');

登录控制器.php

<?php

namespace App\Http\Controllers;
use Session;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\URL;
use App\Models\UserModel;

class LoginController extends Controller
{
    //
    
    public function login(Request $request){
        $email=$request->input('email');
        $password=$request->input('password');

        $this->validate($request,[
        'email'=>'required',
        'password'=>'required'
        ]);
        
        $pass=md5($password);
        $data=DB::SELECT("SELECT * FROM users where email=? and password=?",[$email,$password]);
        
        if (count($data)){
            session()->put('user',$email);
            $value=session('user');
        
        return redirect()->route('userview');
        }else{
            return redirect()->route('login')->with('success','wrong data');
            
        }
        
    }
}

标签: phplaravelroutesmiddleware

解决方案


您的中间件将重定向不在"pujan@pujanovic.com"userview路由的用户。您已将此中间件分配给userview路由。

因此,如果会话中有一个用户并且他们不是"pujan@pujanovic.com",他们将进入一个无限循环,被重定向到相同的路由,然后中间件将再次将他们重定向到相同的路由,在一个循环中。

当您将其分配给adminview. 如果您是“管理员”并且您尝试访问该路线,那么您将陷入无限循环。

简而言之,您是在告诉它无休止地重定向。

这个中间件永远不会让任何人到达目标路由。它只能重定向到其他地方。

更新:

这是您可以为管理员检查中间件做什么的粗略想法

管理中间件:

public function handle($request, $next)
{
    // an auth middleware could handle this itself
    if (! ($email = $request->session()->get('user'))) {
        // not logged in at all
        return redirect()->route('login');
    } 

    if ($email != 'admin@email.com') {
        // not the admin user
        // redirect them away
        return redirect()->route(...);
    }

    // let the request pass through as we have determined they are the admin
    return $next($request);
}

该中间件将被分配给您只希望管理员能够访问的路由。


推荐阅读