Restringir Rutas

Middlewares 08/11/2016

Más Middlewares

Un requisito muy común en cualquier Aplicación, es el de restringir el acceso a ciertos recursos a los usuarios según su estado, rol, etc. Por ejemplo, un usuario no debería de poder tener acceso a editar el perfil de otro usuario.

En esta aplicación, implementaremos un sistema de redireccionamiento para impedir que un usuario logado pueda volver a acceder a la pantalla de login o registro ya que no tiene sentido. También, impediremos que un usuario, que aún no esta logado, pueda solicitar hacer un logout.

Para abordar esta funcionalidad, en Express, como no podía ser de otro modo, emplearemos nuesvos middlewares, que interceptarán las peticiones de los clientes, evaluarán su estado y decidirán si dejarlas proseguir o redireccionarlas a alguna otra ruta. De este modo, podremos restringir el acceso a ciertos lugares.

Estos archivos se ubicarán dentro de server/middlewares.

Authenticated.js

El primer Middleware que crearemos será uno encargado de impedir que cualquier petición de un usuario no logadocontinúe su curso. Para ello, crearemos un fichero authenticated.js con el siguiente contenido:

                
                    module.exports = (req, res, next) => {
                        if (req.user) {
                            next();
                        } else {
                            res.redirect('/auth/login');
                        }
                    };
                
            

Se trata de un código tremendamente simple. Haciendo uso de la variable req.user (ubicada ahí gracias a Passport) podemos comprobar si un Usuario está logado o no. Si la variable no existe, el usuario no estará logado, es entonces cuando lo redireccionaremos, de lo contrario, dejaremos que la petición siga su curso, dando paso a la intervención del siguiente middleware de nuestra Aplicación Express invocando a next().

RedirectAuthenticated.js

Ahora crearemos un Middleware encargado de redirigir a aquellos usuarios que ya esten logados. Lo usaremos para impedir que un usuario que ha iniciado sesión pueda acceder a las rutas de Registro de Usuario y de Login. Para ello, crearemos un fichero RedirectAuthenticated.js y le añadiremos lo siguiente:

                
                    module.exports = (req, res, next) => {
                        if (req.user) {
                            var backURL = req.header('Referer') || '/';
                            res.redirect(backURL);
                        } else {
                            next();
                        }
                    };
                
            

Un código también bastante simple, en este caso, si el usuario esta logado, lo redireccionará a la ruta anterior. La url de la que procedía el usuario es accedida desde req.header, y la empleamos para devolverle por donde vino, impidiéndo así que pueda continuar.

Modificar auth.js

Finalmente, deberemos registrar estos middlewares en las rutas deseadas. Como las rutas que estamos protegiendo tienen que ver con las de login/registro, el router que nos interesa aquí es el de auth.js. Lo editaremos así:

                
                    ...
                    /** Middlewares */
                    var authenticated = require('../middlewares/Authenticated');
                    var redirectAuthenticated = require('../middlewares/RedirectAuthenticated');

                    router.get('/login', redirectAuthenticated, authCtrl.getLogin); // <-- Nuevo

                    router.post('/login', redirectAuthenticated, authCtrl.login);   // <-- Nuevo

                    router.get('/logout', authenticated, authCtrl.logout);          // <-- Nuevo

                    router.get('/register', redirectAuthenticated, authCtrl.getRegister);  // <-- Nuevo

                    router.post('/register', redirectAuthenticated, authCtrl.register);    // <-- Nuevo

                    module.exports = router;
                
            

Simplemente con eso, ya habremos hecho que nuestros middlewares intercepten las peticiones de dichas rutas. Ahora, si nos logamos y seguidamente intentamos acceder a /auth/login, veremos como el sistema nos redirecciona para atrás .

Bonus Middleware

Aunque no es el caso en esta aplicación, otro Middleware muy común en casi todas las aplicaciones, es aquel que restringe a los Usuarios el acceso a la zona de administración. En nuestra aplicación esto es muy sencillo de implementar, ya que nuestro modelo User, tiene entre sus atributos uno llamado role, que por defecto tiene el valor 'user'. Podemos crear un middleware que redirija a todos los que no tengan de role el valor 'admin' por ejemplo ;)

Eso os lo dejaré para que lo implementéis vosotros mismos ya que es muy parecido a los anteriores.

Una vez más, el código de todo este proyecto está aquí.

Si tienes alguna duda o sugerencia, no dudes en participar!