亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

laravel實現簡單用戶權限的示例代碼

2024-05-05 00:09:17
字體:
來源:轉載
供稿:網友

關于權限管理的思考

最近用laravel設計后臺,后臺需要有個權限管理。權限管理實質上分為兩個部分,首先是認證,然后是權限。認證部分非常好做,就是管理員登錄,記錄session。這個laravel中也有自帶Auth來實現這個。最麻煩就是權限認證。

權限認證本質上就是誰有權限管理什么東西。這里有兩個方面的維度,誰,就是用戶維度,在用戶維度,權限管理的粒度可以是用戶一個人,也可以是將用戶分組,如果將用戶分組,則涉及到的邏輯是一個用戶可以在多個組里面嗎?在另外一方面,管理什么東西,這個東西是物的維度,一個頁面是一個東西,一個頁面上的一個元素也是一個東西,或者往大了說,一個功能是一個東西。所以做權限管理最重要的是確認這兩個維度的粒度。這個已經不是技術的事情了,這個是需要需求討論的了。

基于上面的思考,我這次想做的權限管理,在用戶維度,是基于個人的。就是每個人的權限不一樣。在東西的維度,我設置路由為最小的單位,即可以為單個路由設置權限管理。

下面的思考就是使用什么來標記權限,可以使用位,也可以使用字符,也可以使用整型。后來我選擇了字符,基于兩點考慮:1 字符淺顯易懂,在數據庫中查找也比較方便 2 我沒有按照某個權限查找有這個權限的人的需求,即沒有反查需求,使用位,整型等都意義不大。

接下來考慮如何和laravel結合,既然要為每個路由設置訪問權限,那么我當然希望能在laravel的route.php路由管理中配置。最好就是在Route::get的時候有個參數能設置permission。這樣做的好處是權限設置簡易了。在決定路由的時候,就順手寫了權限控制。壞處呢,也很明顯,laravel路由的三種方式只能寫一種了。就是Route::(method)這樣的方式了。

基本決定好了就開干。

路由設計

基本的路由是這樣的

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

就可以判斷這個用戶是否可以看到這個tab了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99热精品这里久久精品| 视频在线一区二区| 国产精品9999| 在线观看国产成人av片| 久久久噜噜噜久久| 日韩在线视频网| 亚洲久久久久久久久久| 亚洲欧美国产精品va在线观看| 久久九九热免费视频| 在线日韩日本国产亚洲| 亚洲欧美制服第一页| 中文字幕v亚洲ⅴv天堂| 77777少妇光屁股久久一区| 2020欧美日韩在线视频| 欧美精品成人91久久久久久久| 日韩av免费在线播放| 久久香蕉国产线看观看网| 日韩电影中文字幕在线观看| 欧美亚洲在线观看| 亚洲香蕉成视频在线观看| 精品偷拍各种wc美女嘘嘘| 亚洲理论在线a中文字幕| 国产亚洲欧美一区| www.美女亚洲精品| 亚洲成**性毛茸茸| 欧美一区二区大胆人体摄影专业网站| 麻豆国产精品va在线观看不卡| 美女999久久久精品视频| 久久久精品中文字幕| 亚洲毛片在线观看| 欧美在线视频在线播放完整版免费观看| 成人网欧美在线视频| 国产欧美在线播放| 亚洲天堂男人的天堂| 欧美日韩免费观看中文| 国产丝袜一区二区| 国产成人综合亚洲| 亚洲成人av资源网| 亚洲综合自拍一区| 久久伊人色综合| 亚洲精品久久久久久久久久久久| 日韩久久免费电影| 欧美激情一区二区久久久| 亚洲桃花岛网站| 国产精品日本精品| 欧美激情videos| 久久久久亚洲精品成人网小说| 久久久精品一区| 夜夜嗨av一区二区三区免费区| 亚洲成色999久久网站| 亚洲裸体xxxx| 68精品国产免费久久久久久婷婷| 国产丝袜一区二区| 国产精品一久久香蕉国产线看观看| 精品国产一区二区三区久久久狼| 97碰在线观看| 色与欲影视天天看综合网| 69**夜色精品国产69乱| 欧美另类xxx| 日韩av在线直播| 一区二区三区四区在线观看视频| 日韩一级裸体免费视频| 国产偷亚洲偷欧美偷精品| 亚洲欧美在线播放| 国产精品中文在线| 欧美在线一级视频| 精品无人区乱码1区2区3区在线| 欧美激情18p| 久久久久久久999| 久久影院模特热| 国产日韩欧美另类| 久久99国产精品久久久久久久久| 国产精品旅馆在线| 国内精久久久久久久久久人| 国产精品中文久久久久久久| 欧美性xxxxx极品娇小| 欧美天天综合色影久久精品| 久久精品福利视频| 国产精品视频免费在线观看| 亚洲美女自拍视频| 一区二区在线免费视频| 亚洲国产精品系列| 日韩大片免费观看视频播放| 国产成人精品免费久久久久| 精品国产1区2区| 国产日韩精品一区二区| 成人性教育视频在线观看| 欧美激情网站在线观看| 超碰91人人草人人干| 久久精品中文字幕| 亚洲字幕在线观看| 国产黑人绿帽在线第一区| 成人午夜激情免费视频| 免费不卡欧美自拍视频| 91av在线不卡| 欧美性视频精品| 久久精品中文字幕电影| 亚洲男人天堂九九视频| 91亚洲va在线va天堂va国| 亚洲欧洲黄色网| 欧美尺度大的性做爰视频| 国产玖玖精品视频| 日韩中文字幕视频在线| 91精品国产精品| 91欧美精品午夜性色福利在线| 国产精品女主播视频| 成人精品在线视频| 亚洲欧美日韩成人| 久久久亚洲网站| 亚洲毛片一区二区| 最近中文字幕日韩精品| 国产精品第10页| 97精品久久久| 国产视频精品va久久久久久| 岛国精品视频在线播放| 中文字幕视频一区二区在线有码| 亚洲一区二区免费| 日韩最新av在线| 亚洲综合中文字幕在线观看| 中文字幕亚洲色图| 久久午夜a级毛片| 欧美亚洲第一页| 成人免费看吃奶视频网站| 久久国产精品久久久久| 中文字幕在线观看亚洲| 国产精品露脸av在线| 日韩黄色在线免费观看| 中文字幕在线精品| 国产精品久久久久免费a∨| 国产日韩中文字幕在线| 欧美激情在线观看视频| 国产精品男女猛烈高潮激情| 最近2019年好看中文字幕视频| 色婷婷综合久久久久中文字幕1| 国产黑人绿帽在线第一区| 久久福利网址导航| 亚洲视频在线免费观看| 欧美激情久久久久久| 亚洲人成在线一二| 久久伊人91精品综合网站| 欧美激情一二三| 日韩欧美亚洲综合| 欧美裸体男粗大视频在线观看| 日韩欧美极品在线观看| 欧洲精品毛片网站| 日韩中文在线中文网在线观看| 亚洲国产99精品国自产| 亚洲精品一区二区三区不| 亚洲欧美日韩中文在线| 国产成人精品综合久久久| 91亚洲国产成人精品性色| 日本亚洲欧美成人| 久久精品一本久久99精品| 久久99久久99精品免观看粉嫩| 国产精品香蕉国产| 久久久成人精品| 欧美成人激情在线| 亚洲第一免费网站| 日韩美女视频中文字幕| 亚洲福利在线视频| 国产欧美va欧美va香蕉在线| 这里只有精品在线播放| 亚洲第一视频网站| 青青a在线精品免费观看|