laravel8 — почему мой запрос на $всегда возвращает false

#php #laravel #middleware

Вопрос:

Я пытаюсь попрактиковаться в промежуточном программном обеспечении в Laravel 8, я создал файл промежуточного программного обеспечения с помощью терминала, зарегистрировал файл в ядре и вызываю промежуточное программное обеспечение по маршруту, но проблема в том, что когда я пытаюсь передать paremeter с URL по localhost:8000/admin/?пользователь=администратор, он всегда перенаправляется на страницу о программе

Вот мой код промежуточного программного обеспечения, это CheckAdmin.php

 namespace AppHttpMiddleware;  use Closure; use IlluminateHttpRequest;  class CheckAdmin {  /**  * Handle an incoming request.  *  * @param IlluminateHttpRequest $request  * @param Closure $next  * @return mixed  */  public function handle(Request $request, Closure $next)  {  if($request-gt;user == 'admin'){  return redirect('/admin');  } else {  return redirect('/about');  }  return $next($request);  } }  

Вот Karnel.php

 namespace AppHttp;  use IlluminateFoundationHttpKernel as HttpKernel;  class Kernel extends HttpKernel {  /**  * The application's global HTTP middleware stack.  *  * These middleware are run during every request to your application.  *  * @var array  */  protected $middleware = [  // AppHttpMiddlewareTrustHosts::class,  AppHttpMiddlewareTrustProxies::class,  FruitcakeCorsHandleCors::class,  AppHttpMiddlewarePreventRequestsDuringMaintenance::class,  IlluminateFoundationHttpMiddlewareValidatePostSize::class,  AppHttpMiddlewareTrimStrings::class,  IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,  ];   /**  * The application's route middleware groups.  *  * @var array  */  protected $middlewareGroups = [  'web' =gt; [  AppHttpMiddlewareEncryptCookies::class,  IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,  IlluminateSessionMiddlewareStartSession::class,  // IlluminateSessionMiddlewareAuthenticateSession::class,  IlluminateViewMiddlewareShareErrorsFromSession::class,  AppHttpMiddlewareVerifyCsrfToken::class,  IlluminateRoutingMiddlewareSubstituteBindings::class,  ],   'api' =gt; [  // LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful::class,  'throttle:api',  IlluminateRoutingMiddlewareSubstituteBindings::class,  ],  ];   /**  * The application's route middleware.  *  * These middleware may be assigned to groups or used individually.  *  * @var array  */  protected $routeMiddleware = [  'auth' =gt; AppHttpMiddlewareAuthenticate::class,  'auth.basic' =gt; IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,  'cache.headers' =gt; IlluminateHttpMiddlewareSetCacheHeaders::class,  'can' =gt; IlluminateAuthMiddlewareAuthorize::class,  'guest' =gt; AppHttpMiddlewareRedirectIfAuthenticated::class,  'password.confirm' =gt; IlluminateAuthMiddlewareRequirePassword::class,  'signed' =gt; IlluminateRoutingMiddlewareValidateSignature::class,  'throttle' =gt; IlluminateRoutingMiddlewareThrottleRequests::class,  'verified' =gt; IlluminateAuthMiddlewareEnsureEmailIsVerified::class,  'CheckAdmin' =gt; AppHttpMiddlewareCheckAdmin::class  ]; }  

Вот web.php

 use AppHttpControllersAboutController; use AppHttpControllersAdminController; use AppHttpControllersMemberController; use AppHttpMiddlewareCheckAdmin; use IlluminateSupportFacadesRoute;  /* |-------------------------------------------------------------------------- | 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('/', function () {  return view('welcome'); });  Route::get('/about', [AboutController::class, 'index']); Route::get('/admin', [AdminController::class, 'index'])-gt;middleware('CheckAdmin'); Route::get('/member', [MemberController::class, 'index']);  

Комментарии:

1. сторона ntoe: вы создадите рекурсивный цикл перенаправлений, когда решите эту проблему с вводом

Ответ №1:

Метод user() зарезервирован в запросе:

 $request-gt;user() //returns an instance of the authenticated user  

Кроме того, установка администратора в качестве параметра URL небезопасна, каждый может добавить это в URL, чтобы стать администратором, вам лучше работать с токенами или с выделенными столбцами/ таблицами в базе данных для проверки администратора,

Ответ №2:

Вы должны проверить приведенное ниже условие в своем админконтроллере, а не в промежуточном программном обеспечении. Здесь я привожу несколько примеров: мой пример промежуточного программного обеспечения:

 namespace AppHttpMiddleware;  use Closure; use IlluminateHttpRequest; use Auth;  class AdminMiddleware {  /**  * Handle an incoming request.  *  * @param IlluminateHttpRequest $request  * @param Closure $next  * @return mixed  */  public function handle(Request $request, Closure $next)  {  if (Auth::user()-gt;user_type == 'admin'){  return $next($request);  }else{  return redirect()-gt;route('home');  }  } }  

Пример логинконтроллера:

 namespace AppHttpControllers;  use IlluminateHttpRequest; use AppModelsUser; use AppModelsPage; use Session; use Auth; use Hash; use DB;   class LoginController extends Controller {  public function adminLogin(){  return view('login');  }   public function adminLogedin(Request $request){   $message = array(  'required.email' =gt; 'This is required',  'required.password' =gt; 'This is required',  );  $this-gt;validate($request,[  'email' =gt; 'required',  'password' =gt; 'required',  ],$message);   $email = $request-gt;email;  $pass = $request-gt;password;   if(Auth::attempt(['email' =gt; $email, 'password' =gt; $pass, 'status' =gt; 1])){  Session::flash('success','Welcome '.Auth::user()-gt;name);  return redirect()-gt;route('dashboard');  }else{  Session::flash('error','Sorry! Try Again. It seems your login credential is not correct.');  return redirect()-gt;back();  }   } }  

Я думаю, что это поможет @Nico Haase Прокомментируйте, если вам нужна какая-либо помощь.

Комментарии:

1. Пожалуйста, добавьте некоторые пояснения к вашему ответу, чтобы другие могли извлечь из него уроки

2. Конечно, @NicoHaase, позвольте мне обновить мой ответ.

3. Большое спасибо, сэр, я буду следовать вашему решению, чтобы улучшить себя.