# Guardas de Rota
O guarda de rota irá verificar alguma condição quando alguem entrar ou sair da rota, assim podemos garantir a segurança destas.
# Guardas Globais
Primeiramente, vamos setar uma nova chave no localStorage:
./src/pages/Login.vue
<script>
export default {
data() {
return {
conta: '',
senha: '',
};
},
methods: {
enviarFormulario() {
// validação futura
// GET para a rota em uma possível API
localStorage.setItem('CONTA', JSON.stringify({
conta: this.conta,
senha: this.senha,
}));
localStorage.setItem('AUTENTICADO', true);
this.$router.push('/dashboard');
},
},
};
</script>
Adicionando o AUTENTICADO, podemos usá-lo para verificação.
Agora vamos utilizar o beforeEnter nas rotas para fazer uma verificação ANTES do usuário poder acessar a rota, ou seja, antes do created() ser executado.
O beforeRouter e afterRouter possuem três parâmetros por padrão: to, from e next. to e from são as referência da rota de onde está vindo(from) e para onde está indo(to). o next é a condição se o redirecionamento da rota continuará ou não.
./src/routes.js
import Home from './pages/Home.vue';
import Login from './pages/Login.vue';
import Dashboard from './pages/Dashboard.vue';
import DashboardHome from './components/dashboard/DashboardHome.vue';
export default [
{
path: '/dashboard',
component: Dashboard,
beforeEnter: (to, from, next) => {
if (localStorage.getItem('AUTENTICADO')) {
next();
} else {
next({
path: '/',
});
}
},
children: [
{ path: '/', component: DashboardHome },
],
},
];
Dessa forma, se acessarmos sem estar com autenticado, iremos ser redireciados ANTES de entrar na rota, evitando problemas.
- Essa é uma forma simples, o correto seria armazenar o booleano em um gerenciador de estado(Vuex) e verificar a entrada e saida de todas as rotas, vamos falar um pouco sobre quando chegarmos nas seções do Vuex.
# VueRouter Multiguard
Também podemos criar grupos de autenticação:
Adicionamos um novo package: yarn add vue-router-multiguard
E aplicamos no router:
import multiguard from 'vue-router-multiguard';
import Home from './pages/Home.vue';
import Login from './pages/Login.vue';
import Dashboard from './pages/Dashboard.vue';
import DashboardHome from './components/dashboard/DashboardHome.vue';
const logado = (to, from, next) => {
if (localStorage.getItem('AUTENTICADO')) {
next();
} else {
next({
path: '/',
});
}
};
const deslogado = (to, from, next) => {
if (!localStorage.getItem('AUTENTICADO')) {
next();
} else {
next({
path: '/dashboard',
});
}
};
export default [
{
path: '/login',
component: Login,
beforeEnter: multiguard([deslogado]),
},
{
path: '/dashboard',
component: Dashboard,
beforeEnter: multiguard([logado]),
children: [
{ path: '/', component: DashboardHome },
],
},
];
Adicionamos o deslogado, pois dessa forma o usuário que já esta na aplicação não consigo acessar o login novamente.
Futuramente iremos implementar a mesma lógica no Header para não exibir as opções de entrar e registrar, e sim para ir no dashboard.
Dessa forma podemos fazer vários tipos e reaproveitar verificações.
Na próxima seção iremos explicar um pouco sobre transições em rotas, estaremos te esperando!