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の大文字と小文字の区別によって発生する問題の分析

推薦する

Vueのprops設定の詳細な説明

<テンプレート> <div class="demo">...

js キャンバスは角丸画像を実現します

この記事では、角を丸くするためのjsキャンバスの具体的なコードを参考までに紹介します。具体的な内容は...

jsはテーブルドラッグオプションを実装します

この記事の例では、テーブルドラッグオプションを実装するためのjsの具体的なコードを参考までに共有して...

CentOS7 64 ビットでの MySQL 5.7 のインストールと設定のチュートリアル

インストール環境: CentOS7 64ビットMINI版、MySQL5.7をインストール1. YUM...

Dockerコンテナの原理の分析

目次01 コンテナの本質とは何か? 02 Cgroupテクノロジーと名前空間テクノロジーの概要03 ...

Node.jsで子プロセスを作成する方法

目次導入子プロセスプロセスを非同期的に作成する同期作成プロセス導入Node.js のメイン イベント...

本番環境でのMySQLパラメータsql_safe_updatesの使用に関する詳細な説明

序文アプリケーションのバグや DBA の誤操作が発生した場合、テーブル全体が更新される可能性がありま...

ドロップダウンメニューとスライドメニューのデザイン例

ドロップダウン メニューやスライド メニューを使用している Web サイトをたくさん見つけたので、私...

MySQLデータを復元する2つの方法

1. はじめに少し前、開発者がテスト環境や本番環境で誤った操作をし、データベースを誤って削除/更新し...

CentOS 8 カスタム ディレクトリ インストール nginx (チュートリアルの詳細)

1. ツールとライブラリをインストールする# PCRE は、Perl 互換の正規表現ライブラリを含...

角度コンテンツ投影の詳細な説明

目次単一コンテンツ投影マルチコンテンツ投影単一条件のコンテンツ投影アプリ-人物-htmlアプリ担当者...

ElementUIカスタムCSSスタイルが有効にならない問題を解決する

例えば、入力ボックスがあります <el-入力 ref="mySearch"...

MySQL データ アーカイブ ツール mysql_archiver の詳細な説明

目次I. 概要2. pt-archiverの主なパラメータ3. mysql_archiverのインス...

MySQL データベース開発仕様 [推奨]

最近、問題のある新しい SQL が本番データベースに入力される数を最小限に抑えるために、開発仕様を整...