簡體   English   中英

Laravel 基於用戶角色的登錄重定向問題:重定向太多次

[英]Laravel login redirect issue based on role of user: redirect too many times

我正在嘗試使用中間件在 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);
    }
}

Web.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');
            
        }
        
    }
}

您的中間件會將不是"pujan@pujanovic.com"的用戶重定向到userview路由。 您已將此中間件分配給userview路由。

因此,如果 session 中有一個用戶並且他們不是"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);
}

該中間件將被分配給您只希望管理員能夠訪問的路由。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM