Проблемы с двумя промежуточными продуктами и abort 401


я использую два промежуточных продукта

ФАЙЛ ПУТЕЙ

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, который предназначен для управления теми, которые не показывают вам страницы, если вы не вошли в систему, и промежуточное программное обеспечение администратора, просто для того, чтобы у вас не было доступа к определенным путям, но я тестировал некоторое время и не могу заставить их работать одновременно.

промежуточное программное обеспечение 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);
        }
    }

ПРОМЕЖУТОЧНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ АДМИНИСТРАТОРА

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>

ЯДРО ПРОМЕЖУТОЧНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

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,

    ];
}

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

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

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

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

Спасибо.

Author: Shaz, 2016-07-05

1 answers

Вы применяете промежуточное программное обеспечение "администратор" к веб-группе (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,
    ],

Эта группа промежуточных продуктов применяется ко всем маршрутам, если вы не изменили ее в соответствующем 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, чтобы он не включал промежуточное программное обеспечение 'web' по умолчанию во все маршруты.
  • оставить промежуточное программное обеспечение администратора вне группы ' web ' и применить его только к определенным путям.

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

 1
Author: Shaz, 2016-07-05 17:10:16