Laravel 5.4. Middlewares
By ercobo | Published | No hay comentarios
Hasta el momento, y siguiendo la serie de entradas de Laravel, hemos conseguido que nuestra api tenga el modulo CRUD de usuarios, y que esté securizada para que solo los usuarios que tengan el token adecuado funcione.
Ahora es el momento de añadir un paso más en la securización de nuestra aplicación Laravel, en este caso adaptar las peticiones para que únicamente los usuarios con un rol/nivel adecuado puedan ejecutar según qué funciones.
Los middleware, son funciones que nos permiten agregar filtros a cada petición HTTP realizada por un usuario en una aplicación. La finalidad de este componente es disminuir la carga de trabajo en los controladores y proporcionar una solución mucho más simple y estándar a la hora de aplicar las restricciones necesarias en el proyecto.
Lo primero será crear el Middleware que vamos a utilizar, en este caso LevelMiddleware.
1 |
$ php artisan make:middleware LevelMiddleware |
Qué nos generará un archivo como el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
namespace App\Http\Middleware; use Closure; class LevelMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); } } |
De momento no hace nada más que mandar la petición ($request) al siguiente elemento dentro del framework para que sea tratado. Más adelante lo modificaremos.
Pero antes, vamos a incluirlo en la aplicación para que se pueda utilizar cuando se hagan las llamadas adecuadas. Para esto, incluiremos nuestro Middleware en el archivo Kernel.php, en las zonas adecuadas, en este caso en el array $routeMiddleware, quedando así:
1 2 3 4 5 6 7 8 9 10 |
protected $routeMiddleware = [ //'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth' => \App\Http\Middleware\VerifyAccessKey::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'level' => \App\Http\Middleware\LevelMiddleware::class, ]; |
Y modificaremos el archivo de rutas «web.php» para incluir este middleware en las peticiones de la api que no sean la del login, en este momento la del grupo de usuarios, quedando este grupo asi:
1 2 3 4 5 6 7 8 9 10 |
Route::group(['middleware' => ['auth:api','level']], function(){ Route::get('users/showactives', 'UsersController@showactives'); Route::get('users/shownotactives', 'UsersController@shownotactives'); Route::resource( 'users', 'UsersController', ['only' => ['index', 'store', 'update', 'destroy', 'show']] ); }); |
Con esto ya estará colocado para que funciones nuestro middleware, y se ejecutará despues de que se haya ejecutado el de «auth:api», que definimos anteriormente para que sea el verificador de token.
Si quereis ver que se ejecuta el middleware, antes de empezar a modificarlo, probar con un cliente rest alguna de las rutas anteriores, y añadid esta linea en el archivo «LevelMiddleware.php», antes del return que se creó por defecto:
1 |
return response()->json(['error' => 'notlevel' ], 403); |
Vereis que al ejecutarlo os devuelve el error de «notlevel».
Y a partir de aquí, tras modificarlo adecuadamente, se podrá utilizar para que las funciones que se deseen estén limitadas por el nivel del usuario, proporcionando la separación para nuestra aplicación.