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の大文字と小文字の区別によって発生する問題の分析
目次Mysql マスタースレーブ同期構成1. 2つのmysqlをインストールする2. MySQL設定...
MySQLサービスを停止するWindowsでは、マイコンピュータを右クリック--管理--サービスと...
新しいプロジェクトを始めるこの記事では主に、新規プロジェクトを0から1まで取り組むプロセスを記録し、...
長い移植と情報検索の期間を経て、組み込みDockerの問題を解決することができました。インターネット...
HTML フォームは、さまざまな種類のユーザー入力を収集するために使用されます。 HTML フォー...
理由は分かりませんが、UIではハニカム効果(手を広げたような効果)のデザインが好まれます。 1. 六...
1. まずパゴダを設置するインストール要件: Python バージョン: 2.6/2.7 (Pago...
目次1. 定義と使用1.1 定義1.2 使用2. 複数のファイルに分割する3. エイリアス序文: T...
目次1 設定ディレクトリとデータディレクトリを作成する3 イメージからホストに構成ファイルをコピーす...
目次序文時間型を保存するのに文字列を使用しないでくださいMySQL の日付型日時タイムスタンプTIM...
私が使用している VMware Workstation Pro のバージョンは次のとおりです。 1....
序文MySQL が SQL SELECT コマンドと WHERE 句を使用してテーブルからデータを読...
使用される Docker イメージが増えるにつれて、イメージを保存する場所、つまりウェアハウスが必要...
MySQL シーケンス AUTO_INCREMENT の詳細な説明とサンプルコードMySQL シーケ...
大画面のデジタル スクロール効果は、最近の作業における大画面 UI ダイアグラムから生まれました。U...