iview-admin2.0 組み込み権限管理iview-admin2.0 には権限管理機能が備わっており、ルーティング メタ オブジェクトのアクセス パラメータを設定することで権限を割り当てることができます。 { パス: ''、 名前: '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 ディレクティブを追加してエクスポートします。注入中に権限チェックを実行します。権限が正常に確認された場合は何も行いません。失敗した場合は、要素を削除します。 <テンプレート> <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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Deepin Linuxでカーネルを手動でアップグレードする方法
>>: MySQLの大文字と小文字の区別によって発生する問題の分析
-9999 ピクセルの画像置換技術は、ここ 10 年近く人気があります。テキスト要素を画像に置き換え...
目次1. 背景建築問題現象2. 分析プロセス接続プール不安に陥る雲を晴らして光を見よう3. 解決策I...
//文法: @media mediatype and | not | only (メディア機能) ...
目次導入取引の4つの特徴トランザクション分離レベル確認するMVCC現在の読書スナップショット読み取り...
目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...
目次Vuex は単一の状態ツリーを使用するため、すべてのアプリケーション状態が比較的大きなオブジェク...
Nginx は現在、最も人気のあるロード バランサーの 1 つです。インターネット トラフィックの...
URL 書き換えは、Web サイトの優先ドメインを決定するのに役立ちます。同じリソース ページの複数...
目次1. テーブル名を変更する方法2. 注記要約: 1. テーブル名を変更する方法RENAME TA...
1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...
会社のビジネスシナリオでは、WeChat アカウント分割機能を使用する必要があります。公式 Web ...
目次それを覆う栗パラメータの受け渡し値渡し共同配送要約する拡張機能 - 遅延評価私は最近、JavaS...
目次COUNT 関数は何をするのですか? MyISAMの「魔法」シンプルなCOUNT最適化近似値を使...
序文この記事は主にMySQLの主キー0と主キー自己排除制約の関係を紹介し、皆さんの参考と学習のために...
フレックス レイアウトは現在よく使用されるレイアウト方法ですが、場合によっては小さな問題が発生するこ...