Laravel 8 - 使用 AuthCheck 中间件,只是尝试检查会话中的用户名,但它给出了一个错误错误描述如下

问题描述

使用 AuthCheck 中间件并尝试在会话中检查 Has Username 但它给出错误错误说明如下

错误 错误异常 尝试读取字符串 LoginController 上的属性“headers” C:\xampp\htdocs\larave8auth\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrftoken.PHP:191

<?PHP

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use Illuminate\Support\Facades\Session;

class LoginController extends Controller
{
    function login()
    {
        return view('login.login');
    }
    function checkLogin(request $request)
    {
        $validate=$request->validate([
            'email'=>'required|email','password'=>'required|min:5|max:15'
        ]);
        
        $user=User::where('email','=',$request->email)->first();
        if(!$user)
        {
            return back()->with('fail','we  don\'t recognised your email');
        }
        else
        {
            
            if(Hash::check($request->password,$user->password))
            {
                Session::put('username',$request->email);
                return redirect('/dashboard');
            }
            else
            {
                return back()->with('fail','Password don\'t match');
            }
        }
    
    }

    function dashboard()
    {
        return view('login.dashboard');
    }
}
?>

AuthCheck.PHP

<?PHP

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class AuthCheck
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request,Closure $next)
    {
         if($request->session()->has('username'))
         {
            return "true";
         }
         else
         {
            return "false";
         }
         
    }
}
?>

web.PHP

<?PHP

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LoginController;
/*
|--------------------------------------------------------------------------
| 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('/login',[LoginController::class,'login']);
Route::post('/checkLogin','checkLogin'])->name('checkLogin');
Route::group(['middleware'=>['AuthCheck']],function(){
    Route::get('/user',[UserController::class,'index']);
    Route::get('/dashboard','dashboard']);
});
?>

解决方法

因为你的中间件只是返回一个字符串,而不是一个重定向。当您希望允许系统继续提前处理请求时,您确实会返回 $next($request);return abort(404);。您的中间件必须返回一个 Response 对象,或 $next($request) :

public function handle(Request $request,Closure $next)
{
    if (session()->has('username')) {
        return $next($request);
    } else {
        return abort(404);
    }
}