本記事の例ではLaravel5の権限管理の実裝方法を説明しています。參考のために皆さんと共有してください。詳細(xì)は次のとおりです:
パーミッション管理についての考え
最近、laravel を使用してバックエンドを設(shè)計(jì)したのですが、バックエンドにはパーミッション管理が必要です。権限管理は基本的に 2 つの部分に分かれており、最初に認(rèn)証、次に権限です。認(rèn)証部分は非常に簡単に実行できます。つまり、管理者がログインしてセッションを記録します。 Laravel にはこれを?qū)g裝するための Auth も付屬しています。一番面倒なのは権限認(rèn)証です。
権限認(rèn)証とは本質(zhì)的には、誰が何を管理する権限を持っているかを意味します。ユーザー ディメンションでは、権限管理の粒度を 1 人のユーザーにすることも、ユーザーがグループ化されている場合は、1 人のユーザーを複數(shù)のグループに含めることもできます。 ?一方、何かを管理する場合、この物は物という次元を持ちます。ページは物であり、ページ上の要素も物です。さらに広く言えば、機(jī)能も物です。したがって、権限管理で最も重要なことは、これら 2 つの次元の粒度を確認(rèn)することです。これはもはや技術(shù)的な問題ではなく、議論する必要があります。
上記の考え方に基づいて、今回私がやりたい権限管理はユーザー次元の個人に基づいたものになります。ただ、権限は人それぞれ異なります。東西次元ではルートを最小単位、つまり単一ルートに対して権限管理を設(shè)定します。
次の考え方は、アクセス許可をマークするために使用するものです。ビット、文字、または整數(shù)を使用できます。その後、1. キャラクターが理解しやすく、データベースで検索しやすいこと、2. 特定の権限に基づいてこの権限を持つ人物を検索する必要がないこと、の 2 つの點(diǎn)を考慮してキャラクターを選択しました。ビットを使用する逆検索の必要はなく、タイプ全體などはほとんど意味がありません。
次に、laravelと組み合わせる方法を考えます。 ルートごとにアクセス許可を設(shè)定する必要があるので、當(dāng)然laravelのroute.phpのルーティング管理で設(shè)定できればと思います。最善の方法は、Route::get 中に権限を設(shè)定するパラメーターを用意することです。この利點(diǎn)は、権限設(shè)定が簡単であることです。ルーティングを決めるときに都合よくパーミッションコントロールを書きました。欠點(diǎn)は、laravel ルーティングの 3 つのメソッドのうち 1 つしか記述できないことも明らかであることです。これは Route::(メソッド) です。
基本的には決定を下して開始します。
ルーティングの設(shè)計(jì)
基本的なルーティングは次のとおりです
Route::post('/admin/validate', ['uses' => 'AdminController@postValidate', 'permissions'=>['admin.validate', 'admin.index']]);
ここで、基本的なルーティング アクションが設(shè)定された後、アクセス許可屬性が設(shè)定されます。この屬性は、たとえば投稿リクエストであるため、配列として設(shè)計(jì)されています。特定のページでトリガーされ、別のページでもトリガーされる可能性がある場合、この投稿リクエストには両方のページのルーティング権限が必要です。
ここでは、admin.validate の権限制御を使用します。このようにして、権限をグループ化できます。データベースには、[admin] => [ という 2 次元配列が保存されます。 'validate' , 'index']; 一般に、背景表示には 2 つの次元があり、1 つはヘッドのタブ バーです。左側(cè)のナビゲーション バー、つまりこの 2 次元の配列と、背景のタブおよびナビゲーション列の間に 1 対 1 の対応関係があります。
ミドルウェアの設(shè)計(jì)
さて、ミドルウェアを終了し、このミドルウェアを使用するようにすべてのルートを設(shè)定します
<?php namespace App\Http\Middleware; use Illuminate\Support\Facades\Session; use Closure; class Permission { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $permits = $this->getPermission($request); $admin = \App\Http\Middleware\Authenticate::getAuthUser(); // 只要有一個有權(quán)限,就可以進(jìn)入這個請求 foreach ($permits as $permit) { if ($permit == '*') { return $next($request); } if ($admin->hasPermission($permit)) { return $next($request); } } echo "沒有權(quán)限,請聯(lián)系管理員";exit; } // 獲取當(dāng)前路由需要的權(quán)限 public function getPermission($request) { $actions = $request->route()->getAction(); if (empty($actions['permissions'])) { echo "路由沒有設(shè)置權(quán)限";exit; } return $actions['permissions']; } }
ここで最も重要なことは、$request->route()-> ;getAction() からの getPermission 関數(shù)です。 ) を使用して、このルートのアクション定義を取得し、次に、route.php で定義されているルートの権限を権限フィールドから取得します。
その後、上記のミドルウェアは次のようになります:
admin?>hasPermission(admin?>hasPermission(permit);
これにはモデルの設(shè)計(jì)が含まれます。
モデル設(shè)計(jì)
<?php namespace App\Models\Admin; use App\Models\Model as BaseModel; class Admin extends BaseModel { protected $table = 'admin'; // 判斷是否有某個權(quán)限 public function hasPermission($permission) { $permission_db = $this->permissions; if(in_array($permission, $permission_db)) { return true; } return false; } // permission 是一個二維數(shù)組 public function getPermissionsAttribute($value) { if (empty($value)) { return []; } $data = json_decode($value, true); $ret = []; foreach ($data as $key => $value) { $ret[] = $key; foreach ($value as $value2) { $ret[] = "{$key}.{$value2}"; } } return array_unique($ret); } // 全局設(shè)置permission public function setPermissionsAttribute($value) { $ret = []; foreach ($value as $item) { $keys = explode('.', $item); if (count($keys) != 2) { continue; } $ret[$keys[0]][] = $keys[1]; } $this->attributes['permissions'] = json_encode($ret); } }
データベースに二次元配列をjsonとして保存し、laravelのAttributeのgetメソッドとsetメソッドを使ってデータベース內(nèi)のjsonと外部プログラムロジックとの接続を完了します。その後、hasPermission は非常に簡単に思えます。in_array を直接判斷するだけでOKです。
フォローアップ
この権限認(rèn)証のロジックは明確になります。次に、ページ上のタブまたはナビゲーションを異なる権限を持つユーザーに表示する必要がある場合は、ビュー
@if ($admin->hasPermission('admin.index')) @endif
で判斷するだけで、ユーザーがタブを表示できるかどうかを判斷できます。
概要
これはユーザー権限の実裝はそれほど複雑ではありませんが、バックグラウンドのニーズのほとんどを満たすことができると思います。もちろん、最適化できる點(diǎn)はたくさんあるかもしれません。たとえば、hasPermission が nosql または pg に格納されている場合、直接 DB リクエストが存在するかどうかを判斷できますか?許可などは?

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)