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

推薦する

Mysql データベースのマスタースレーブ同期構成

目次Mysql マスタースレーブ同期構成1. 2つのmysqlをインストールする2. MySQL設定...

MySQL ルートパスワードエラー番号 1045 の解決方法

MySQLサービスを停止するWindowsでは、マイコンピュータを右クリック--管理--サービスと...

Reactプロジェクトの新規作成からデプロイまでの実装例

新しいプロジェクトを始めるこの記事では主に、新規プロジェクトを0から1まで取り組むプロセスを記録し、...

組み込み移植 docker エラー問題 (概要)

長い移植と情報検索の期間を経て、組み込みDockerの問題を解決することができました。インターネット...

HTMLフォーム要素の詳しい解説(パート1)

HTML フォームは、さまざまな種類のユーザー入力を収集するために使用されます。 HTML フォー...

CSS でハニカム/六角形アトラスを実装するためのサンプルコード

理由は分かりませんが、UIではハニカム効果(手を広げたような効果)のデザインが好まれます。 1. 六...

pagodaを使用してionCube拡張機能をインストールする方法

1. まずパゴダを設置するインストール要件: Python バージョン: 2.6/2.7 (Pago...

TypeScript名前空間の説明

目次1. 定義と使用1.1 定義1.2 使用2. 複数のファイルに分割する3. エイリアス序文: T...

Docker ケース分析: MySQL データベース サービスの構築

目次1 設定ディレクトリとデータディレクトリを作成する3 イメージからホストに構成ファイルをコピーす...

MySQL で日付を保存するためのベスト プラクティス ガイド

目次序文時間型を保存するのに文字列を使用しないでくださいMySQL の日付型日時タイムスタンプTIM...

VMware Workstation Pro でサーバー仮想マシンを構築する (グラフィック チュートリアル)

私が使用している VMware Workstation Pro のバージョンは次のとおりです。 1....

Mysql は null 値の first/last メソッドの例を実装します

序文MySQL が SQL SELECT コマンドと WHERE 句を使用してテーブルからデータを読...

Dockerプライベートウェアハウスレジストリの導入

使用される Docker イメージが増えるにつれて、イメージを保存する場所、つまりウェアハウスが必要...

MySQL シーケンス AUTO_INCREMENT の詳細な説明とサンプルコード

MySQL シーケンス AUTO_INCREMENT の詳細な説明とサンプルコードMySQL シーケ...

このような大画面のデジタルスクロール効果が必要になる場合があります

大画面のデジタル スクロール効果は、最近の作業における大画面 UI ダイアグラムから生まれました。U...