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キャッシュ間の同期ソリューションについての簡単な説明

推薦する

CSS を使用して固定左列と適応右列の 2 列レイアウトを実現する 4 つの方法

1. フロート+オーバーフロー:非表示このメソッドは主にオーバーフローを通じて BFC をトリガーし...

ファイル書き込みを使用して Linux アプリケーションをデバッグする方法

Linux ではすべてがファイルなので、Android システム自体は Linux + Java だ...

jQuery プロジェクトで重複送信を防ぐ方法

新しいプロジェクトでは、axios によって重複した送信を防ぐことができますが、古いプロジェクト (...

MySql ログイン パスワードを忘れた場合とパスワードを忘れた場合の解決策

方法1: MySQL では、次のコマンド ラインで MySQL サーバーを起動することにより、アクセ...

Docker で MySQL 接続と設定ファイルの最大数を変更する

1. MySQLイメージを見つける ドッカーps 2. ミラーmysqlイメージを入力する dock...

nginx 設定ファイルパスとリソースファイルパスを表示する方法

nginx 設定ファイルのパスを表示する nginx -t 経由nginx -t コマンドの本来の機...

Vue はボタンをクリックしてファイルをダウンロードする操作コードを実装します (バックエンド Java)

前回の記事では、ボタンをクリックしてファイルをダウンロードするVueの機能を紹介しました。今日は、ボ...

Web インタビュー: MVC と MVVM の違いと、Vue が MVVM に完全に準拠していない理由

目次MVCとMVVMの違い前述のMVCC の概要長所と短所MVVM概要MVVM 実装者 — Vue ...

MySQL全文インデックスの原理と欠点

MySQL フルテキスト インデックスは、特定のテーブルの特定の列に表示されるすべての単語のリストを...

Linux で同じバージョンの R を使用して Seurat2 と Seurat3 を同時にインストールするチュートリアル

Seurat は、単一細胞解析用の重量級の R パッケージです。使用したことがある人なら誰でも、その...

MySQL データ圧縮パフォーマンス比較の詳細

目次1. テスト環境1.1 ハードウェアとソフトウェア1.2 テーブル構造2. テストの目的2.1 ...

DockerはGitを使用してJenkinsのリリースとテストプロジェクトの詳細なプロセスを実装します

目次1. Dockerをインストールする2. カスタムネットワークアドレスを作成する3. Docke...

Linuxはiftopを使用してネットワークカードのトラフィックをリアルタイムで監視します

Linux は iftop を使用してネットワーク カードのトラフィックをリアルタイムで監視します。...

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...