您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關利用laravel怎么實現一個用戶權限功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
基本的路由是這樣的
Route::post('/admin/validate', ['uses' => 'AdminController@postValidate', 'permissions'=>['admin.validate', 'admin.index']]);
這里在基本的制定路由action之后設置了一個permissions的屬性,這個屬性設計成數組,因為比如一個post請求,它可能在某個頁面會觸發,也可能在另外一個頁面觸發,那么這個post請求就需要同時擁有兩個頁面路由的權限。
這里使用admin.validate的權限控制,這樣,可以將權限分組,admin都是關于admin相關的分組,在數據庫中,我就會存儲一個二維數組,[admin] => ['validate', 'index']; 存儲成二維數組而不是一維的好處呢,一般后臺展示是有兩個維度的,一個是頭部的tab欄,一個是左邊的nav欄,就是說這個二維的數組和后臺的tab,nav欄是一一對應的。
中間件設計
好了,下面我們就掛上中間件,并且設置所有的路由都走這個中間件
<?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(); // 只要有一個有權限,就可以進入這個請求 foreach ($permits as $permit) { if ($permit == '*') { return $next($request); } if ($admin->hasPermission($permit)) { return $next($request); } } echo "沒有權限,請聯系管理員";exit; } // 獲取當前路由需要的權限 public function getPermission($request) { $actions = $request->route()->getAction(); if (empty($actions['permissions'])) { echo "路由沒有設置權限";exit; } return $actions['permissions']; } }
這里最關鍵的就getPermission函數,從$request->route()->getAction()來獲取出這個路由的action定義,然后從其中的permissions字段中獲取route.php中定義的路由權限。
然后上面的middleware有個admin?>hasPermission(permit); 這個就涉及到model的設計。
model設計
<?php namespace App\Models\Admin; use App\Models\Model as BaseModel; class Admin extends BaseModel { protected $table = 'admin'; // 判斷是否有某個權限 public function hasPermission($permission) { $permission_db = $this->permissions; if(in_array($permission, $permission_db)) { return true; } return false; } // permission 是一個二維數組 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); } // 全局設置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方法,完成了數據庫中json和外界程序邏輯的連接。然后hasPermission就顯得很輕松了,直接判斷in_array就ok了。
后續
這個權限認證的邏輯就清晰了。然后如果頁面中某個tab或者nav需要對不同權限的用戶展示,只需要在view中判斷
@if ($admin->hasPermission('admin.index')) @endif
看完上述內容,你們對利用laravel怎么實現一個用戶權限功能有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。