ナビゲーションガードでのページ遷移制御(beforeEach)
やりたいこと
- URLの直叩きによる画面遷移を権限によって制御する
実装(ナビゲーションガード以外の部分)
- default.vueには独自のコンポーネントを設置しており、menuというプロパティにメニューと遷移先のデータをバインドすることでメニューを表示している。
default
1 2<template> 3 <cas-default-template 4 id="sideNav" 5 title="タイトル" 6 :page-title="title" 7 :sub-title="subTitle" 8 :menus="availableMenus" //computedで権限に対するメニューを作成している 9 :router="true" 10 @click.native="check" 11 > 12 <nuxt /> 13 </cas-default-template> 14</template> 15 16<script lang="ts"> 17//import等は省略 18created() { 19 this.$store.dispatch('menu/security').then(() => { 20 //ログインユーザの権限情報取得 21 const response: SecurityInfo = this.security 22 }) 23 /**権限情報に基づきメニューを生成 */ 24 this.getAvailableMenus() 25 } 26 27/**取得した権限情報をもとにメニューを構成 */ 28 getAvailableMenus() { 29 for (let i = 0; i < this.menus.length; i++) { 30 if (this.menus[i].disabled) { 31 this.availableMenus.push(this.menus[i]) 32 for (let j = 0; j < this.menus[i].subs.length; j++) { 33 if (this.menus[i].subs[j].disabled) { 34 this.menus[i].subs[j].disabled = false 35 } 36 } 37 } 38 } 39 } 40</script> 41
ナビゲーションガードの実装
- pluginsにファイルを作成してます(middlewareの方が適切?)
router
1import Vue from 'vue' 2import Router from 'vue-router' 3 4Vue.use(Router) 5 6export default async ({ app, store }) => { 7 8 await store.dispatch('menu/security') 9 let kngnInfo 10 app.router.beforeEach((to, from) => { 11 //ログインユーザの権限情報を取得 12 const security = store.getters['menu/security'] 13 //URLとそれに対する権限のオブジェクトを用意 14 const menus = [ 15 { kngn: 'kngnAAA', url: '/AAA' }, 16 { kngn: 'kngnBBB', url: '/BBB' }, 17 { kngn: 'kngnCCC', url: '/CCC' }, 18 { kngn: 'kngnDDD', url: '/DDD' }, 19 ] 20 //遷移先URLの権限を持っているかを確認 21 const toKngn = menus.find(menu => { 22 return menu.url === to.path 23 }) 24 //権限がない場合は遷移前画面へリダイレクト 25 if (!security[toKngn.kngn]) { 26 kngnInfo = security[toKngn.kngn] 27 next(from.path) 28 } 29 next() 30 }) 31}
- 現状以下のように
This page could not be found
が発生しています。
【Vue.js】ナビゲーションガードについてなどを見て`afterEachを使ってみたりしましたが、afterなので権限がなくても一瞬遷移してしまいます。
- 助言をいただければ幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。