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