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

推薦する

ドキュメントの場所の比較

<br />2 年前に PPK が投稿した素晴らしいブログ記事では、contains()...

protobuf の簡単な紹介と Ubuntu 16.04 環境でのインストールチュートリアル

protobufの簡単な紹介Protobuf は、Google のオープンソースのシリアル化プロトコ...

Linuxでサーバーのハードウェア情報を表示する方法

みなさんこんにちは。今日は12連休ですが、何かお買い物はしましたか?今日は「Linux View S...

フォント宝庫 50 種類の素晴らしい無料英語フォントリソース パート 2

デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...

Docker でタイムゾーンの問題に対処する方法

背景ここ 2 日間 Docker を使用していたところ、コンテナの起動後に date -R の出力タ...

MySQL 5.7 mysql コマンドラインクライアントの使用コマンドの詳細

MySQL 5.7コマンドを使用するMySQLコマンドラインクライアント1. パスワードを入力してく...

Mysql ファジークエリが大文字と小文字を区別するかどうかの詳細な調査

序文最近、私は小さな個人ブログ プロジェクトを書くのに忙しくしています。 「グローバル検索」機能を実...

VMware 15.5 に CentOS7 をインストールするためのグラフィック チュートリアル

1. VMware 15.5で新しい仮想マシンを作成する1. VMware を開き、ホームページで「...

iframe ページパラメータの文字化けの問題について議論

非常に珍しいパラメータ文字化けの問題に遭遇しました。まずページを見てみましょう写真に示すように、月次...

デジタルテーブル特殊効果を実現するネイティブJS

この記事では、ネイティブ JS で実装されたデジタル時計エフェクトを紹介します。エフェクトは次のとお...

Vue はネストされたルーティングメソッドの例を実装します

1. ネストされたルーティングはサブルーティングとも呼ばれます。実際のアプリケーションでは、通常、ネ...

MySQL の詳細な単一テーブルの追加、削除、変更、クエリの CRUD ステートメント

MySQL の追加、削除、変更、クエリステートメント1. 練習シートを作成するここでの練習表は3つの...

MySQL での find_in_set() 関数の使用に関する詳細な説明

まず、例を見てみましょう。記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホッ...

Nginx 仮想ホストの詳細な分析

目次1. 仮想ホスト1.1 仮想ホストの概念1.2 仮想ホストタイプ2. IP仮想ホストに基づく2....

JavaScript が Jingdong のカルーセル効果を模倣

この記事では、JD.comのカルーセル効果の表示を実現するためのJavaScriptの具体的なコード...