iview権限管理の実装

iview権限管理の実装

iview-admin2.0 組み込み権限管理

iview-admin2.0 には権限管理機能が備わっており、ルーティング メタ オブジェクトのアクセス パラメータを設定することで権限を割り当てることができます。
デフォルトのロールは super_admin と admin です。ここで、ユーザーのみがドキュメント サイドバー項目を表示できる権限を割り当てます。

  {
    パス: ''、
    名前: 'doc',
    メタ: {
      タイトル: 'ドキュメント'、
      href: 'https://lison16.github.io/iview-admin-doc/#/',
      アイコン: 'ios-book',
      アクセス: ['ユーザー']
    }
  },

サイドバーに「ドキュメント」列が表示されなくなります。 src/store/module/app.jsのmenuListを取得します。これはサイドバーのリストです。

  ゲッター: {
    メニューリスト: (状態、ゲッター、ルート状態) => getMenuByRouter(ルーター、ルート状態.user.access)、
    エラーカウント: 状態 => 状態.errorList.length
  },

このゲッターメソッドは主にgetMenuByRouterを実行し、次にsrc/libs/util.jsをチェックして特定のコードを見つけます。

/**
 * @param {Array} list ルートリストからメニューリストを取得します * @returns {Array}
 */
エクスポート const getMenuByRouter = (リスト、アクセス) => {
  res = [] とします
  forEach(リスト、項目 => {
    if (!item.meta || (item.meta && !item.meta.hideInMenu)) {
      obj = {
        アイコン: (item.meta && item.meta.icon) || ''、
        名前: アイテム名、
        メタ: アイテム.meta
      }
      if ((hasChild(item) || (item.meta && item.meta.showAlways)) && showThisMenuEle(item, access)) {
        obj.children = getMenuByRouter(item.children、アクセス)
      }
      if (item.meta && item.meta.href) obj.href = item.meta.href
      if (showThisMenuEle(item, access)) res.push(obj)
    }
  })
  戻り値
}
const showThisMenuEle = (item, access) => {
  if (item.meta && item.meta.access && item.meta.access.length) {
    if (hasOneOf(item.meta.access, access)) が true を返す
    それ以外の場合はfalseを返す
  } それ以外の場合はtrueを返す
}

この時点で、アクセス権限を決定するプロセスがより明確になります。コードは、主に access という状態に保存されているユーザー情報を取得し、それをルートで許可されているアクセスと比較します。ユーザーのアクセスがルート アクセス リストで許可されている範囲内であれば、権限が確認されます。たとえば、ユーザー アクセスは ['admin', 'super_admin'] ですが、ドキュメント アクセスは ['user'] に設定します。

hasOneOf(['admin','super_admin'],['user']) // false、認証失敗

hasOneOf は iview-admin のツール メソッドです。クエリ対象の配列の少なくとも 1 つの要素がターゲット配列に含まれているかどうかを判断するために使用されます。詳細なコードは下部にあります。

権限に基づいてコンポーネントの表示を制御する

一般的に、権限に基づいてボタンなどのページ要素の表示を制御する必要もあります。方法は 2 つあります。1 つは、認証命令をカスタマイズするか、認証コンポーネントをカスタマイズして、認証が必要な要素をラップすることです。

カスタム認証ディレクティブ

iview-admin は、カスタム ディレクティブを src/directive フォルダーに配置します。directives.js ファイルは、各ファイルで定義されたカスタム ディレクティブをインポートし、それらを均一にエクスポートする役割を担います。 auth ディレクティブを実装します。

'./module/draggable' からドラッグ可能なものをインポートします
'./module/clipboard' からクリップボードをインポートします
'./module/auth' から auth をインポートします
constディレクティブ = {
  ドラッグ可能、
  クリップボード、
  認証
}
デフォルトディレクティブをエクスポートする

次に、importDirective メソッドが src/directive/index.js にエクスポートされ、入力パラメーターは Vue で、ロジックはディレクティブを登録することです。

'./directives' からディレクティブをインポートします

const importDirective = Vue => {
  /**
   * ドラッグコマンド v-draggable="options"
   * オプション = {
   * トリガー: /ドラッグトリガーとしてCSSセレクターを渡す/、
   * body: /移動するコンテナのCSSセレクタを渡す/,
   * 回復: /ドラッグ終了後に元の位置に戻すかどうか/
   * }
   */
  Vue.directive('ドラッグ可能', directive.draggable)
  /**
   * クリップボードディレクティブ v-draggable="options"
   * オプション = {
   * value: /入力ボックス内のv-modelにバインドされた値/、
   * 成功: /コピー成功後のコールバック/、
   * エラー: /コピー失敗後のコールバック/
   * }
   */
  Vue.directive('クリップボード', directive.clipboard)
  Vue.directive('auth', directive.auth) 
}

エクスポート デフォルト インポート ディレクティブ

この importDirective メソッドは main.js で使用され、実際の Vue が入力パラメータとして渡されます。

'@/directive' から importDirective をインポートします
/**
 * 登録手順 */
インポートディレクティブ(Vue)
...

src/directive/module/auth.jsを編集する

'@/store' からストアをインポートします
エクスポートデフォルト{
  挿入: (el, バインディング, vnode) => {
    const 値 = バインディング値
    定数アクセス = store.state.user.access
    if (access.indexOf(値) === -1) {
      el.削除()
    }
  }
}

auth ディレクティブを追加してエクスポートします。注入中に権限チェックを実行します。権限が正常に確認された場合は何も行いません。失敗した場合は、要素を削除します。
試してみましょう。トップメニューの折りたたみボタンを例に挙げます。beader-bar.vue

<テンプレート>
  <div class="ヘッダーバー">
    <sider-trigger v-auth="'admin'" :collapsed="collapsed" icon="md-menu" @on-change="handleCollpasedChange"></sider-trigger>
    ...
  </div>
</テンプレート>

v-auth="'admin'" の場合はボタンが表示され、ユーザーの場合はボタンは非表示になります。

カスタム認証コンポーネント

認証コンポーネントをカスタマイズして、機能コンポーネントauth.vueを作成することもできます。

<スクリプト>
'@/store' からストアをインポートします
エクスポートデフォルト{
  機能的: 真、
  小道具: {
    権限:
      タイプ: 文字列、
      必要: true
    }
  },
  レンダリング(h, コンテキスト) {
    const { props, scopedSlots } = コンテキスト
    定数アクセス = store.state.user.access
    access.indexOf(props.authority) > -1 を返します ? scopedSlots.default() : null
  }
}
</スクリプト>

認証が成功した場合は slot が返され、そうでない場合は null が返されるため、auth でラップされた要素は表示されません。次に、auth.vue をグローバル コンポーネントとして登録して、使用するたびにインポートする必要がないようにしておきます。 main.jsを編集する

'_c/auth/auth.vue' から Auth をインポートします。
// コンポーネントを登録する Vue.component('Auth',Auth)

使用するときは、コンポーネントをauthでラップするだけです

<テンプレート>
  <div class="ヘッダーバー">
    <認証権限="ユーザー">
      <sider-trigger :collapsed="collapsed" icon="md-menu" @on-change="handleCollpasedChange"></sider-trigger>
    </認証>
  </div>
</テンプレート>

要約する

コンポーネントベースの記述またはカスタム命令のいずれかを使用して実装できます。コンポーネントベースのアプローチでは、記述するコードが多くなり、カスタム命令の方が柔軟性があります。また、違いが1つあります。カスタム命令が権限の確認に失敗した場合、要素は直接削除されます。したがって、この時点で管理者からユーザーに切り替えても、要素は削除されているため、表示されません。表示するにはページを更新する必要がありますが、コンポーネントベースのアプローチであれば、そのようなことは起こらず、柔軟に対応できます。通常、これはほとんど影響しません。

なお、アクセスを文字列に設定しています。配列に設定しても動作します。iview に付属している hasOneOf メソッドが使えます。

/**
 * @param {Array} target ターゲット配列* @param {Array} arr クエリする配列* @description クエリする配列の少なくとも 1 つの要素がターゲット配列に含まれているかどうかを判断します*/
エクスポート const hasOneOf = (targetarr, arr) => {
  ターゲットarr.some(_ => arr.indexOf(_) > -1) を返します
}

iview 権限管理の実装に関するこの記事はこれで終わりです。iview 権限管理に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ツリー状の権限テーブル(拡張可能なテーブル)を実装するVue.js iviewの詳しい解説
  • Vue iviewは動的ルーティングと権限検証機能を実装します

<<:  Deepin Linuxでカーネルを手動でアップグレードする方法

>>:  MySQLの大文字と小文字の区別によって発生する問題の分析

推薦する

9999px に別れを告げる新しい CSS 画像置換テクニック (背景表示と画面外へのテキストの移動)

-9999 ピクセルの画像置換技術は、ここ 10 年近く人気があります。テキスト要素を画像に置き換え...

MySQL接続がハングする理由の詳細な説明

目次1. 背景建築問題現象2. 分析プロセス接続プール不安に陥る雲を晴らして光を見よう3. 解決策I...

CSS3 @mediaの基本的な使い方のまとめ

//文法: @media mediatype and | not | only (メディア機能) ...

MySQL トランザクションの詳細

目次導入取引の4つの特徴トランザクション分離レベル確認するMVCC現在の読書スナップショット読み取り...

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

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

vuex名前空間の使用

目次Vuex は単一の状態ツリーを使用するため、すべてのアプリケーション状態が比較的大きなオブジェク...

1 つの記事で Nginx の現在の制限を理解する (簡単な実装)

Nginx は現在、最も人気のあるロード バランサーの 1 つです。インターネット トラフィックの...

Nginx URL 書き換えメカニズムの原理と使用例

URL 書き換えは、Web サイトの優先ドメインを決定するのに役立ちます。同じリソース ページの複数...

MySQLでテーブル名を変更する方法と注意すべき点

目次1. テーブル名を変更する方法2. 注記要約: 1. テーブル名を変更する方法RENAME TA...

JavaScript スタイル オブジェクトと CurrentStyle オブジェクトのケース スタディ

1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...

Nodejs で WeChat アカウント分割を実装するためのサンプルコード

会社のビジネスシナリオでは、WeChat アカウント分割機能を使用する必要があります。公式 Web ...

JavaScriptにおける評価戦略の詳細な説明

目次それを覆う栗パラメータの受け渡し値渡し共同配送要約する拡張機能 - 遅延評価私は最近、JavaS...

MySQL COUNT関数の使用と最適化

目次COUNT 関数は何をするのですか? MyISAMの「魔法」シンプルなCOUNT最適化近似値を使...

MySQL における主キーが 0 であることと主キーの自己選択制約の関係についての詳しい説明 (詳細)

序文この記事は主にMySQLの主キー0と主キー自己排除制約の関係を紹介し、皆さんの参考と学習のために...

フレックスレイアウトにおける画像変形の解決策の詳細な説明

フレックス レイアウトは現在よく使用されるレイアウト方法ですが、場合によっては小さな問題が発生するこ...