Vue-vue-router権限問題の解決
4210 ワード
vueプロジェクトでは、バックエンドとのデータインタラクションはajxaのみで実行できます.ユーザー権限の問題を解決する上で、バックグラウンドのブロッカーはログインする必要がある要求をブロックすることができます.vueプロジェクトでは、vue-routerのナビゲーションガード機能も実現できます.シーン記述 ユーザーがログインしていないため、トップページへのアクセスにユーザー権限を検証する必要はないシーンがあるとします.管理バックグラウンドページにアクセスすると、ユーザーがログインしていない場合に自動的にログインページにジャンプし、バックグラウンドのブロッキングと同様の効果が得られます.
vueプロジェクトでは、このような効果をどのように実現しますか.vue-routerが提供するナビゲーションガード機能により実現できます.グローバルガード vue-routerのナビゲーション・ガードは、グローバルであってもよいし、ルーティング・レベルであってもよい.次に、グローバルなナビゲーション・ガードがどのように実現されるかについて説明します.まず、ログイン時にユーザがログインするか否かのフラグ位置(ログインプロセスのコードを省略する、ここではログインフラグの記憶のみを示す) を記憶する.次に、アクセスするためにどのルーティングが必要であり、アクセスする必要がないかをルーティングテーブルに指定する必要があります./router/index.jsでは,バックグラウンド管理モジュールとトップページモジュールの違いは,バックグラウンド管理モジュールにmeta:{login_required:true}があり,これがルーティングのメタデータであり,ルーティングのいくつかのプライベート属性を設定できることである.このlogin_requiredとは、ログインしたユーザーのみが管理モジュールにアクセスできることを示すページです. ログインIDとログインが必要なルーティングが格納された後、次に、現在のログインIDがfalseであり、アクセスするルーティングがログインしなければアクセスできない場合、アクセスを拒否し、ログインページに直接ジャンプするグローバルなブロック判断が必要です.メールでjsでは、 が実現される.は、次に、/manageがジャンプする/signinページに直接アクセスするかどうかを検証することができます. コンポーネントレベルのガード たとえば、あるコンポーネントで、現在他のページに向かっているときに、現在のページの内容が失われることを警告するプロンプトが必要です.この効果はvue-routerでも実現できます
コンポーネント内:
アラートを必要としないルーティングでは、このページにアクセスしてアラートを必要としないことを示すメタデータを追加できます.まとめ 以上の2つの例により,筆者らは,グローバルおよびコンポーネントレベルでナビゲーション・ガードを実現する機能を示し,この効果は最終的にバックグラウンドのフィルタに相当し,これはシステムの安全性と可用性に大きく役立つ.
vueプロジェクトでは、このような効果をどのように実現しますか.vue-routerが提供するナビゲーションガード機能により実現できます.
// ,
var userinfo = response.data.result;
userinfo.isSignin = true;//
that.$store.dispatch("setUserInfo", userinfo);
export default new Router({
routes: [
//
{
path: '/', component: resolve => {require(['../components/home/Home'], resolve)},
children: [
{path: '/', name: 'index', component: resolve => {require(['../components/home/Index'], resolve)},},
{path: 'product1', name: 'product1', component: resolve => {require(['../components/home/Product1'], resolve)},},
{path: 'product2', name: 'product2', component: resolve => {require(['../components/home/Product2'], resolve)},},
{path: 'contact', name: 'contact', component: resolve => {require(['../components/home/Contact'], resolve)},},
//
{path: 'signin', name: 'signin', component: resolve => {require(['../components/sign/Signin'], resolve)},},
{path: 'signup', name: 'signup', component: resolve => {require(['../components/sign/Signup'], resolve)},},
{path: 'forgetpwd', name: 'forgetpwd', component: resolve => {require(['../components/sign/ForgetPwd'], resolve)},},
{path: 'resetpwd', name: 'resetpwd', component: resolve => {require(['../components/sign/ResetPwd'], resolve)},}
]
},
//
{
path: '/manage',meta: {login_required: true}, name: 'manage', component: resolve => {require(['../components/manage/Manage'], resolve)},
}
]
});
//
router.beforeEach((to, from, next) => {
//
let isSignin = localStorage.getItem("isSignin");
let matched = to.matched.some((item) => {
return item.meta.login_required;
});
if(isSignin == 'false' && matched){
next('/signin');
}else{
next();
}
});
コンポーネント内:
//
// methodes
beforeRouteLeave(to,from,next) {
var that = this;
let matched = to.matched.some((item) => {
return item.meta.case_not_need_confirm;
});
if(matched || that.notNeedConfirm){//
next();
}else{
that.$confirm(that.$t('promotInfo.closePromot'), that.$t('promotInfo.prompt'), {
confirmButtonText: that.$t('btnName.submitBtn'),
cancelButtonText: that.$t('btnName.cancelBtn'),
type: 'warning',
center: true
}).then(() => {
next();
});
}
}
アラートを必要としないルーティングでは、このページにアクセスしてアラートを必要としないことを示すメタデータを追加できます.
meta: {case_not_need_confirm: true}