Vue.js 2で管理者ページを作成していますが、認証されていないユーザーが/admin
ルートにアクセスして/login
にリダイレクトすることを防ぎたいです。そのために、管理コンポーネントで次のようにIn-Component Guard beforeRouteEnter
を使用しました
...
beforeRouteEnter(to, from, next) {
if(userNotLogedIn) {
this.$router.Push('/login');
}
}
ここでの問題は、this
がbeforeRouteEnter
フックで定義されていないことです。この場合、$router
にアクセスして別のURLにリダイレクトする適切な方法は何ですか?
ドキュメント は次のように述べています:
beforeRouteEnter
ガードは、ナビゲーションが確認される前に呼び出されるため、this
にアクセスできません。したがって、新しい入力コンポーネントはまだ作成されていません。
次のようにnext
を呼び出すことで、別のページにリダイレクトできます。
beforeRouteEnter(to, from, next) {
if(userNotLogedIn) {
next('/login');
}
}
同じ結果を得る別の方法を次に示します。したがって、各保護ルートでbeforeRouteEnter
を使用する代わりに、meta
プロパティを使用してルーター構成で保護ルートを定義し、beforeEach
すべてのルートをフックし、保護されたルートを確認し、必要に応じてログインページにリダイレクトします。
let router = new Router({
mode: 'history',
routes: [
{
path: '/profile',
name: 'Profile',
component: Profile,
meta: {
auth: true // A protected route
},
},
{
path: '/login',
name: 'Login',
component: Login, // Unprotected route
},
]
})
/* Use this hook on all the routes that need to be protected
instead of beforeRouteEnter on each one explicitly */
router.beforeEach((to, from, next) => {
if (to.meta.auth && userNotLoggedIn) {
next('/login')
}
else {
next()
}
})
// Your Vue instance
new Vue({
el: '#app',
router,
// ...
})