#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. Большое спасибо, сэр, я буду следовать вашему решению, чтобы улучшить себя.