Vueは2つのルーティング許可制御メソッドを実装しています

Vueは2つのルーティング許可制御メソッドを実装しています

ルーティング権限制御は、さまざまなビジネス担当者がアクセスできるページの権限を制限するために、バックグラウンド管理システムでよく使用されます。

許可のないページの場合は、404 ページにジャンプするか、許可がないことを示すプロンプトを表示できます。

方法 1: ルーティング メタ情報 (meta)

すべてのページをルーティング テーブルに配置し、アクセスするときにロールの権限を確認するだけです。
vue-router は、ルートを構築するときにメタ構成インターフェースを提供します。メタ情報にルートに対応する権限を追加し、ルートガードで関連する権限をチェックしてルートジャンプを制御できます。

メタ属性で、このルートにアクセスできるロールを roles に追加します。各ユーザーがログインすると、そのユーザーのロールが返されます。次に、ページにアクセスすると、ルートのメタ属性がユーザーのロールと比較されます。ユーザーのロールがルートのロール内にある場合は、アクセスが許可されます。そうでない場合は、アクセスが拒否されます。

例1: 役割による判断

定数myRouter = 新しいVueRouter({
 ルート: [{
        パス: '/login',
        名前: 'ログイン',
        メタ: {
         役割: ['管理者', 'ユーザー']
        },
        コンポーネント: () => import('@/components/Login')
    },{
        パス: '/home',
        名前: 'ホーム',
        メタ: {
            役割: ['管理者']
        },
        コンポーネント: () => import('@/views/Home')
    },{
     パス: '/404',
     コンポーネント: () => import('@/components/404')
   }]
})

//インターフェースを通じてバックグラウンドから取得したユーザーロールをトークンに格納できると仮定します。const role = 'user'

myRouter.beforeEach((to,from,next)=>{
 to.meta.roles.includes(role) の場合 {
  next() //解放 }else{
  next({path:"/404"}) //404ページにジャンプ}
})

例2: 権限を必要とする識別子をメタに追加する

定数myRouter = 新しいVueRouter({
 ルート: [{
        パス: '/login',
        名前: 'ログイン',
        メタ: {
         タイトル: 「ログインページ」
         アイコン: 「ログイン」
        },
        コンポーネント: () => import('@/components/Login')
    },{
        パス: '/home',
        名前: 'ホーム',
        メタ: {
         タイトル: 「ホーム」
         アイコン: 'ホーム'、
         認証が必要: 有効
        },
        コンポーネント: () => import('@/views/Home')
    },{
     パス: '/404',
     コンポーネント: () => import('@/components/404')
   }]
})

myRouter.beforeEach((to,from,next)=>{
 flag = to.matched.some(record=>record.meta.requireAuth) とします。
 //ここでは、一致したループを使用して、to.meta が直接使用されない理由を見つけます。
 // サブルートがある場合は、まず通常のクリックロジックに従って、第 1 レベルのルートの次に第 2 レベルのルートが実行され、権限の判断が同じでなければならないことを明確にします //to.meta => サブルートのメタを直接検索します。第 1 レベルのルートに requireAuth:true が追加されていない場合は、第 1 レベルのルートページをブロックし、第 2 レベルのルートページに入ることができません。ユーザーが URL アドレスバーを直接改ざんすると、第 2 レベルのページに入ることができ、権限の問題が発生する可能性があります。次に、この権限の下にあるすべてのルートを //to.matched としてマークする必要があります => matched はルート配列であり、サブルートを含むすべてのルートの属性を収集するため、ループ判断と検索方法を通じて、第 1 レベルのルートに権限識別子を追加するだけで、その下にある他のサブルートを承認できます。
 if(フラグ){
  次()
 }それ以外{
  次へ({パス:"/404"})
 }
})

デメリット: 各ルートジャンプを検証するのはコンピューティング リソースの無駄です。また、ユーザーがアクセスできないルートは、理論上はマウントすべきではありません。

方法 2: ルーティング テーブルを動的に生成する (addRoutes)

ユーザー権限やユーザー属性に基づいてメニューやルーティング テーブルを動的に追加することで、ユーザー機能をカスタマイズできます。
vue-router は addRoutes() メソッドを提供しており、これを使うと動的にルートを登録することができます。動的にルートを追加するということは、ルーティングテーブルにルートをプッシュするということなので注意が必要です。ルートは順番にマッチングされるため、404 ページなどのルートは動的に追加した最後尾に配置する必要があります。

//ストア.js
// vuexに動的に登録する必要があるルートを抽出します。const dynamicRoutes = [
  {
    パス: '/manage',
    名前: '管理'、
    メタ: {
      認証が必要: 有効
    },
    コンポーネント: () => import('./views/Manage')
  },
  {
    パス: '/userCenter',
    名前: 'UserCenter',
    メタ: {
      認証が必要: 有効
    },
    コンポーネント: () => import('./views/UserCenter')
  }
]

ユーザーのカスタマイズされたメニューを保存するには、vuex に userRoutes 配列を追加します。 setUserInfo では、バックエンドから返されたメニューに従ってユーザーのルーティング テーブルが生成されます。

//ストア.js
setUserInfo (状態、ユーザー情報) {
  state.userInfo = ユーザー情報
  state.auth = true // ユーザー情報を取得するときにauthをtrueにします。もちろん、userInfoを直接判断することもできます。
  // ユーザールーティングテーブルを生成する state.userRoutes = dynamicRoutes.filter(route => {
    userInfo.menus.some(menu => menu.name === route.name) を返します
  })
  router.addRoutes(state.userRoutes) // ルートを登録する}

メニューのレンダリングを変更する

// アプリ.vue
<div id="nav">
   <router-link to="/">ホーム</router-link>
   <router-link to="/login">ログイン</router-link>
   <template v-for="(menu, index) of $store.state.userInfo.menus">
     <ルーターリンク:to="{ name: menu.name }":key="index">{{menu.title}}</ルーターリンク>
   </テンプレート>
</div>

Vue のルーティング許可制御を実装する 2 つの方法についての記事はこれで終わりです。Vue のルーティング許可制御に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueルーティング権限制御分析
  • Vueカスタム指示と動的ルーティングによる権限制御の実現
  • Vue ルーティングガードとページログイン権限制御を設定する方法 (2 つの方法)
  • Vue の権限制御 (ルート検証) の 2 つの方法
  • vue-routerルーティングの遅延読み込みと権限制御の詳細な説明

<<:  Docker コンテナのカスタム ホストのネットワーク アクセス操作

>>:  MySQLとRedisキャッシュ間の同期ソリューションについての簡単な説明

推薦する

MySQL 全体または単一のテーブルデータのエクスポート

単一のテーブルをエクスポートするmysqldump -u ユーザー -p db名 テーブル名 >...

Docker クロスホストネットワーク (オーバーレイ) の実装

1. Dockerのホスト間通信Docker クロスホスト ネットワーク ソリューションには以下が含...

JavaScript でのカスタム スワイパー コンポーネントの詳細な説明

目次エフェクト表示コンポーネント設定ステップ1ステップ2ステップ3コンポーネントの使用ステップ1ステ...

HTML シンボルからエンティティへのアルゴリズムのチャレンジ

チャレンジ:文字列内の文字 &、<、>、" (二重引用符)、および &...

dockerにros2をインストールするための詳細な手順

目次メイントピック1. UbuntuにDockerをインストールする2. DockerにROS2-F...

Nginx ロードバランシング クラスタの実装

(1)実験環境youxi1 192.168.5.101 ロードバランサーyouxi2 192.168...

MySQLのロングトランザクションに関する深い理解

序文:この記事では主にMySQLのロングトランザクションに関する内容を紹介します。例えば、トランザク...

Linux システムの .bash_profile ファイルの詳細な説明

目次1. 環境変数$PATH: 2. 環境変数を変更します。 3. bash_profileの目的要...

動的なセカンダリメニューを実現するためのCSS

シンプルなセカンダリメニューを動的に実装するマウスを第 1 レベルのラベル上に置くと、マウスが小さな...

Mysql 5.6.37 winx64 インストール デュアル バージョン mysql ノート

マシンに MySQL バージョン 5.0 がすでに存在する場合は、最新バージョンの MySQL のイ...

ボタンに醜い灰色の枠線が付いています。これを削除するにはどうすればよいですか?

ダイアログをクロージャで使用し、右上隅の向こう側に閉じるボタンがあるダイアログを描画しました。ボタン...

HTMLページでよく使われるいくつかの小さなメソッド

<Head>タグに追加する<meta http-equiv="pragm...

JavaScript カスタム カレンダー効果

この記事では、JavaScriptカスタムカレンダーエフェクトの具体的なコードを参考までに紹介します...

Navicat for MySQL 15 登録とアクティベーションの詳細なチュートリアル

1. Navicat for MySQL 15をダウンロードするhttps://www.navica...

CentOS7にNginxを素早くインストールする方法を教えます

目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...