Автор: Дотун Джолаосо
Автор: сумасшедший технарь
оригинал:blog.log Rocket.com/v UE-middle W…
Воспроизведение без разрешения строго запрещено**
Часто при построении SPA необходимо защитить определенные маршруты. Например, предположим, что у нас есть маршрут панели мониторинга, который разрешает только аутентифицированным пользователям, мы можем использовать промежуточное программное обеспечение аутентификации, чтобы гарантировать, что законные пользователи могут получить к нему доступ.
В этом уроке мы научимся использоватьVue-RouterТрубы промежуточного программного обеспечения реализуются для приложения Vue.
Что такое конвейер промежуточного программного обеспечения?
Конвейер ПО промежуточного слоя — это набор различных ПО промежуточного слоя, работающих параллельно друг с другом.
Продолжая предыдущий случай, предположим, что в/dashboard/moviesЕсть еще один маршрут, к которому мы хотим, чтобы имели доступ только подписанные пользователи. Мы уже знаем, что для доступа к маршруту панели инструментов вам необходимо пройти аутентификацию. Итак, как защитить/dashboard/moviesКак насчет маршрутизации, чтобы обеспечить доступ только аутентифицированным и подписанным пользователям? С помощью конвейера ПО промежуточного слоя несколько ПО промежуточного слоя можно связать вместе и обеспечить их параллельную работу.
Начинать
Первое использованиеVue CLIБыстро создайте новый проект Vue.
vue create vue-middleware-pipeline
Установить зависимости
После создания и установки каталога проекта перейдите во вновь созданный каталог и выполните следующие команды из терминала:
npm i vue-router vuex
Vue-router— официальный роутер для Vue.js
Vuex— это библиотека управления состоянием для Vue.
Создать компонент
Наши программы будут состоять из трех компонентов.
Login — Этот компонент отображается для неавторизованных пользователей.
Dashboard — Этот компонент отображается для зарегистрированных пользователей.
Movies — Мы показываем этот компонент пользователям, которые вошли в систему и имеют активную подписку.
Давайте создадим эти компоненты. переключиться наsrc/componentsкаталог и создайте следующие файлы:Dashboard.vue,Login.vueа такжеMovies.vue
Изменить с помощью следующего кодаLogin.vueдокумент:
<template>
<div>
<p>This is the Login component</p>
</div>
</template>
Изменить с помощью следующего кодаDashboard.vueдокумент:
<template>
<div>
<p>This is the Dashboard component for authenticated users</p>
<router-view/>
</div>
</template>
Наконец, добавьте следующий код вMovies.vueВ файле:
<template>
<div>
<p>This is the Movies component for authenticated and subscribed users</p>
</div>
</template>
создать магазин
СразуVuexОдним словом, хранилище — это просто контейнер для сохранения состояния нашей программы. Это позволяет нам определить, аутентифицирован ли пользователь, и проверить, подписан ли пользователь.
В папке src создайтеstore.jsфайл и добавьте в этот файл следующий код:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
user: {
loggedIn: false,
isSubscribed: false
}
},
getters: {
auth(state) {
return state.user
}
}
})
Магазин содержит в своем состоянии auserобъект.userобъект содержитloggedInа такжеisSubscribedсвойство, которое помогает нам определить, вошел ли пользователь в систему и имеет ли он действительную подписку. Мы также определяемgetterвозвращатьuserобъект.
определить маршруты
Прежде чем создавать маршруты, вы должны определить их и связать с ними соответствующее промежуточное ПО.
Доступны для всех, кроме аутентифицированных пользователей/login. Когда вы получите доступ к этому маршруту по аутентификации пользователя, маршрутизация должна быть перенаправлена на приборную панель. Этот маршрут должен сопровождатьсяguestпромежуточное ПО.
Только авторизованные пользователи могут получить доступ/dashboard. В противном случае пользователь должен быть перенаправлен на/loginмаршрутизация. мы кладемauthПромежуточное ПО связано с этим маршрутом.
Только авторизованные и подписанные пользователи могут получить доступ/dashboard/movies. Маршрут подлежитisSubscribedа такжеauthЗащита промежуточного программного обеспечения.
Создать маршрут
Далее, вsrcсоздать каталогrouterпапку, затем создайтеrouter.jsдокумент. Отредактируйте файл, используя следующий код:
import Vue from 'vue'
import Router from 'vue-router'
import store from '../store'
import Login from '../components/Login'
import Dashboard from '../components/Dashboard'
import Movies from '../components/Movies'
Vue.use(Router)
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/login',
name: 'login',
component: Login
},
{
path: '/dashboard',
name: 'dashboard',
component: Dashboard,
children: [{
path: '/dashboard/movies',
name: 'dashboard.movies',
component: Movies
}
],
}
]
})
export default router
Здесь мы создаем новыйrouterнапример, передавая несколько параметров конфигурации, а такжеroutesсвойство, которое принимает все маршруты, которые мы определили ранее. Обратите внимание, что эти маршруты в настоящее время не защищены. Мы исправим это в ближайшее время.
Затем введите маршрут и сохраните его в экземпляре Vue. Изменить с помощью следующего кодаsrc/main.jsдокумент:
import Vue from 'vue'
import App from './App.vue'
import router from './router/router'
import store from './store'
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App),
}).$mount('#app')
Создать промежуточное ПО
существуетsrc/routerсоздать каталогmiddlewareпапку, а затем создать в этой папкеguest.js,auth.jsа такжеIsSubscribed.jsдокумент. Добавьте следующий код вguest.jsВ файле:
export default function guest ({ next, store }){
if(store.getters.auth.loggedIn){
return next({
name: 'dashboard'
})
}
return next()
}
guestПромежуточное ПО проверяет, аутентифицирован ли пользователь. Если вы прошли аутентификацию, вы будете перенаправлены наdashboardдорожка.
Затем отредактируйте следующий кодauth.jsдокумент:
export default function auth ({ next, store }){
if(!store.getters.auth.loggedIn){
return next({
name: 'login'
})
}
return next()
}
существуетauthВ промежуточном программном обеспечении мы используемstoreПроверьте, находится ли пользователь в данный моментauthenticated. В зависимости от того, авторизован ли уже пользователь, мы либо продолжаем запрос, либо перенаправляем его на страницу входа.
Изменить с помощью следующего кодаisSubscribed.jsдокумент:
export default function isSubscribed ({ next, store }){
if(!store.getters.auth.isSubscribed){
return next({
name: 'dashboard'
})
}
return next()
}
isSubscribedпромежуточное ПО вauthпромежуточное ПО. мы используемstoreПроверьте, подписан ли пользователь. Если пользователь подписан, он может получить доступ к ожидаемому маршруту, в противном случае перенаправить его обратно на страницу панели инструментов.
защитить маршрутизацию
Теперь, когда все промежуточное ПО создано, давайте воспользуемся им для защиты маршрута. Изменить с помощью следующего кодаsrc/router/router.jsдокумент:
import Vue from 'vue'
import Router from 'vue-router'
import store from '../store'
import Login from '../components/Login'
import Dashboard from '../components/Dashboard'
import Movies from '../components/Movies'
import guest from './middleware/guest'
import auth from './middleware/auth'
import isSubscribed from './middleware/isSubscribed'
Vue.use(Router)
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [{
path: '/login',
name: 'login',
component: Login,
meta: {
middleware: [
guest
]
}
},
{
path: '/dashboard',
name: 'dashboard',
component: Dashboard,
meta: {
middleware: [
auth
]
},
children: [{
path: '/dashboard/movies',
name: 'dashboard.movies',
component: Movies,
meta: {
middleware: [
auth,
isSubscribed
]
}
}],
}
]
})
export default router
Здесь мы импортируем все промежуточное ПО, а затем определяем метаполе, содержащее массив промежуточного ПО для каждого маршрута. Массив промежуточного программного обеспечения содержит все промежуточное программное обеспечение, которое мы хотим связать с определенным маршрутом.
Навигатор маршрута Vue
Мы используем Vue Router, предоставленныйнавигационная охранадля защиты маршрута. Эти навигационные охранники в основном защищают маршруты, перенаправляя или отменяя маршруты.
Одним из охранников является глобальный охранник, который обычно вызывается перед запуском маршрута. Чтобы зарегистрировать глобальный авангард, вам необходимоrouterопределить экземплярbeforeEachметод.
const router = new Router({ ... })
router.beforeEach((to, from, next) => {
//necessary logic to resolve the hook
})
beforeEachМетод принимает три параметра:
to:Это маршрут, к которому мы собираемся получить доступ.
from:Это наш текущий маршрут.
next:Это то, что называется крючкомfunction.
запустить промежуточное ПО
использоватьbeforeEachХуки могут запускать наше промежуточное ПО.
const router = new Router({ ...})
router.beforeEach((to, from, next) => {
if (!to.meta.middleware) {
return next()
}
const middleware = to.meta.middleware
const context = {
to,
from,
next,
store
}
return middleware[0]({
...context
})
})
Сначала мы проверяем, содержит ли текущий обрабатываемый маршрутmiddlewareМетаполе свойства. если найденоmiddlewareсвойство, назначьте егоconstПеременная. Затем определитеcontextобъект, который содержит все, что нам нужно передать каждому промежуточному ПО. Затем вызовите первое промежуточное ПО в массиве промежуточного ПО как функцию и передайтеcontextобъект.
попытаться получить доступ/dashboardмаршрут, вы должны быть перенаправлены наloginмаршрутизация. Это потому что/src/store.jsсерединаstore.state.user.loggedInсвойство установлено наfalse. Будуstore.state.user.loggedInсвойство изменено наtrue, он должен иметь доступ/dashboardмаршрутизация.
Теперь промежуточное ПО работает, но не так, как мы хотим. Наша цель — реализовать конвейер, который может запускать несколько промежуточных программ для определенного пути.
return middleware[0]({ …context})
Обратите внимание на эту строку кода в блоке кода выше, мы звоним только изmetaПервое промежуточное ПО прошло в массиве промежуточного ПО в поле. Итак, как мы можем гарантировать, что другое промежуточное ПО (если оно есть), содержащееся в массиве, также вызывается? Тут на помощь приходят трубы.
Создать конвейер
переключиться наsrc/routerкаталог, затем создайтеmiddlewarePipeline.jsдокумент. Добавьте в файл следующий код:
function middlewarePipeline (context, middleware, index) {
const nextMiddleware = middleware[index]
if(!nextMiddleware){
return context.next
}
return () => {
const nextPipeline = middlewarePipeline(
context, middleware, index + 1
)
nextMiddleware({ ...context, next: nextPipeline })
}
}
export default middlewarePipeline
middlewarePipelineЕсть три параметра:
context:Это то, что мы создали ранееcontextобъект, который можно передать каждому промежуточному ПО в стеке.
middleware:Это вrouteизmetaопределяется на полеmiddlewareсам массив.
index:Это вmiddlewareтекущее промежуточное ПО, работающее в массивеindex.
const nextMiddleware = middleware[index]
if(!nextMiddleware){
return context.next
}
Здесь мы просто проходимmiddlewarePipelineфункциональныйindexВытащите промежуточное ПО. если вindexне смог найтиmiddleware, затем верните значение по умолчаниюnextПерезвоните.
return () => {
const nextPipeline = middlewarePipeline(
context, middleware, index + 1
)
nextMiddleware({ ...context, next: nextPipeline })
}
мы называемnextMiddlewareпройтиcontext, а затем пройтиnextPipeline const. Примечательно,middlewarePipelineЭто рекурсивная функция, которая будет вызывать себя, чтобы запустить следующее промежуточное ПО в стеке, добавляя при этомindexувеличить до 1.
сложить их вместе
давайте использоватьmiddlewarePipeline. Отредактируйте, как этот код нижеsrc/router/router.jsдокумент:
import Vue from 'vue'
import Router from 'vue-router'
import store from '../store'
import Login from '../components/Login'
import Dashboard from '../components/Dashboard'
import Movies from '../components/Movies'
import guest from './middleware/guest'
import auth from './middleware/auth'
import isSubscribed from './middleware/isSubscribed'
import middlewarePipeline from './middlewarePipeline'
Vue.use(Router)
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [{
path: '/login',
name: 'login',
component: Login,
meta: {
middleware: [
guest
]
}
},
{
path: '/dashboard',
name: 'dashboard',
component: Dashboard,
meta: {
middleware: [
auth
]
},
children: [{
path: '/dashboard/movies',
name: 'dashboard.movies',
component: Movies,
meta: {
middleware: [
auth,
isSubscribed
]
}
}],
}
]
})
router.beforeEach((to, from, next) => {
if (!to.meta.middleware) {
return next()
}
const middleware = to.meta.middleware
const context = {
to,
from,
next,
store
}
return middleware[0]({
...context,
next: middlewarePipeline(context, middleware, 1)
})
})
export default router
Здесь мы используем<code> middlewarePipeline <code>Последующий запуск промежуточного стека включен.
return middleware[0]({
...context,
next: middlewarePipeline(context, middleware, 1)
})
После вызова первого промежуточного программного обеспечения используйтеmiddlewarePipelineфункцию, а также вызывать последующее промежуточное ПО, содержащееся в стеке, до тех пор, пока промежуточное ПО не перестанет быть доступным.
если вы посетите/dashboard/moviesмаршрут, который должен быть перенаправлен на/dashboard. Это потому чтоuserВ настоящее времяauthenticatedНо нет активной подписки. еслиstoreсерединаstore.state.user.isSubscribedсвойство установлено наtrue, вы должны иметь доступ/dashboard/moviesмаршрутизированный.
В заключение
Промежуточное ПО — отличный способ защитить различные маршруты в вашем приложении. Это очень простая реализация, которая может использовать несколько промежуточных программ для защиты одного маршрута в приложении Vue. ты сможешьGitHub.com/do hoard/v UE-…