Проблемы с двумя middlewares и abort 401

я использую два middlewares

ФАЙЛ МАРШРУТОВ

Route::group(['middleware'=>['web','auth']], function() {

    Route::group(['middleware'=>'administrador'], function() {
       Route::resource('usuarios', 'UsuariosController');
    });

    Route::resource('categorias', 'CategoriasController');
    Route::resource('tags', 'tagsController');
    Route::resource('articulos', 'articulosController');
});

route::any('imagenes','ImagenesController@index');

route::any('front','FrontController@index');
route::any('buscaCat/{nombrecat}','FrontController@buscaCategoria');
route::any('buscaTag/{nombre}','FrontController@buscaTag');

первый - типичный auth, который - это, чтобы контролировать тех, которые тебе не показывает страницы, если ты не logueado, и middleware администратор, он просто для того, чтобы ты не имел доступа к неким маршрутам, но я иду немного пытаясь и не могу заставить функционировать два одновременно.

(Назначенный по умолчанию) Middleware auth

<?php

namespace App\Http\Middleware;

    class Authenticate
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @param  string|null  $guard
         * @return mixed
         */
        public function handle($request, Closure $next, $guard = null)
        {
            if (Auth::guard($guard)->guest()) {
                if ($request->ajax() || $request->wantsJson()) {
                    return response('Unauthorized.', 401);
                } else {
                    return redirect()->guest('login');
                }
            }

            return $next($request);
        }
    }

MIDDLEWARE АДМИНИСТРАТОР

use Illuminate\Support\Facades\Auth;
use Closure;

class administrador
{
    public function handle($request, Closure $next)
    {


       if(!is_null(Auth::user()) and Auth::user()->tipo!= 'administrador'):
        abort(401);
       else:
                return $next($request);
       endif;

    }
}

ОДЕЛ ОШИБКУ ПЕРСОНАЛИЗИРОВАННЫЙ 401

   <body>
        <div class="container">
            <div class="content">
                <div class="title">PERMISO DENEGADO, NO PUEDES ENTRAR AQUI</div>
                <div >
                    <a href="{{url('front')}}" class="btn btn-primary">Volver</a>
                </div>
            </div>
        </div>
    </body>
</html>

KERNEL MIDDLEWARE

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 = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,

            //*****************PERSONALIZADO***************************************
           \App\Http\Middleware\administrador::class,
        ],

        'api' => [
            'throttle:60,1',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
          //*****************PERSONALIZADO***************************************
         'administrador' => \App\Http\Middleware\administrador::class,

    ];
}

middleware администратор я это протестировал в ficherod маршрутов и в драйвере пользователи, и результат - тот же самый.

Проблема, когда он применяет abort, состоит в том, что он я применяет A TODAS, абсолютно все маршруты, даже не определенную в группах маршрутов middleware, из-за того, что помещает пример, когда я вхожу будучи другой вещью, которая не является администратором, меня отпускает экран, но потом уже я не могу возвращаться назад ни со стрелами браузера, и если я пытаюсь менять маршрут с бруска адресов, сообщение пребывает, только я могу соглашаться на страницу комментируя группы маршрутов и комментируя middleware в kernel.

Если я пробую соглашаться на маршрут, как front, у которого не были бы должны бы быть проблемы в соглашении, сообщение пребывает. Потом, если я пробую делать перенаправление вместо abort, я думаю, что он входит в конфликт с первым middleware и делает бесконечное перенаправление.

Какие выборы у меня есть?

Спасибо.

1
задан 01.05.2017, 21:09
1 ответ

Ты применяешь middleware 'администратора' к группе (middlewares) Веб:

    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,

        //*****************PERSONALIZADO***************************************
       \App\Http\Middleware\administrador::class,
    ],

Эта группа middlewares применяется ко ВСЕМ маршрутам, если только ты это не изменишь в соответствующем service provider.

В настоящем коде Laravel, RouteServiceProvider это показывает:

/**
 * Define the routes for the application.
 *
 * @param  \Illuminate\Routing\Router  $router
 * @return void
 */
public function map(Router $router)
{
    $this->mapWebRoutes($router);
    //
}

/**
 * Define the "web" routes for the application.
 *
 * These routes all receive session state, CSRF protection, etc.
 *
 * @param  \Illuminate\Routing\Router  $router
 * @return void
 */
protected function mapWebRoutes(Router $router)
{
    $router->group([
        'namespace' => $this->namespace, 'middleware' => 'web',
    ], function ($router) {
        require app_path('Http/routes.php');
    });
}

Какие выборы у тебя есть?

  • Изменять route service provider для того, чтобы он не включил по умолчанию 'Веб' middleware во все маршруты.
  • Оставлять middleware администратор вне 'Веб' группы и применять это только к специфическим маршрутам.

Лучший выбор зависит от рисунка твоего приложения.

1
ответ дан 24.11.2019, 13:54
  • 1
    Как всегда превосходный ответ, Я ФУНКЦИОНИРУЮ верно. Спасибо. – KurodoAkabane 05.07.2016, 20:49