欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

laravel實(shí)現(xiàn)簡(jiǎn)單用戶權(quán)限的示例代碼

 更新時(shí)間:2019年05月28日 09:12:49   作者:薛俊皓  
這篇文章主要介紹了laravel實(shí)現(xiàn)簡(jiǎn)單用戶權(quán)限的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

關(guān)于權(quán)限管理的思考

最近用laravel設(shè)計(jì)后臺(tái),后臺(tái)需要有個(gè)權(quán)限管理。權(quán)限管理實(shí)質(zhì)上分為兩個(gè)部分,首先是認(rèn)證,然后是權(quán)限。認(rèn)證部分非常好做,就是管理員登錄,記錄session。這個(gè)laravel中也有自帶Auth來實(shí)現(xiàn)這個(gè)。最麻煩就是權(quán)限認(rèn)證。

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

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

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

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

基本決定好了就開干。

路由設(shè)計(jì)

基本的路由是這樣的

Route::post('/admin/validate', ['uses' => 'AdminController@postValidate', 'permissions'=>['admin.validate', 'admin.index']]);

這里在基本的制定路由action之后設(shè)置了一個(gè)permissions的屬性,這個(gè)屬性設(shè)計(jì)成數(shù)組,因?yàn)楸热缫粋€(gè)post請(qǐng)求,它可能在某個(gè)頁面會(huì)觸發(fā),也可能在另外一個(gè)頁面觸發(fā),那么這個(gè)post請(qǐng)求就需要同時(shí)擁有兩個(gè)頁面路由的權(quán)限。

這里使用admin.validate的權(quán)限控制,這樣,可以將權(quán)限分組,admin都是關(guān)于admin相關(guān)的分組,在數(shù)據(jù)庫中,我就會(huì)存儲(chǔ)一個(gè)二維數(shù)組,[admin] => ['validate', 'index']; 存儲(chǔ)成二維數(shù)組而不是一維的好處呢,一般后臺(tái)展示是有兩個(gè)維度的,一個(gè)是頭部的tab欄,一個(gè)是左邊的nav欄,就是說這個(gè)二維的數(shù)組和后臺(tái)的tab,nav欄是一一對(duì)應(yīng)的。

中間件設(shè)計(jì)

好了,下面我們就掛上中間件,并且設(shè)置所有的路由都走這個(gè)中間件

<?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();

    // 只要有一個(gè)有權(quán)限,就可以進(jìn)入這個(gè)請(qǐng)求
    foreach ($permits as $permit) {
      if ($permit == '*') {
        return $next($request);
      }
      if ($admin->hasPermission($permit)) {
        return $next($request);
      }
    }

    echo "沒有權(quán)限,請(qǐng)聯(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'];
  }
}

這里最關(guān)鍵的就getPermission函數(shù),從$request->route()->getAction()來獲取出這個(gè)路由的action定義,然后從其中的permissions字段中獲取route.php中定義的路由權(quán)限。

然后上面的middleware有個(gè)admin−>hasPermission(permit); 這個(gè)就涉及到model的設(shè)計(jì)。

model設(shè)計(jì)

<?php namespace App\Models\Admin;

use App\Models\Model as BaseModel;

class Admin extends BaseModel {

  protected $table = 'admin';

  // 判斷是否有某個(gè)權(quán)限
  public function hasPermission($permission)
  {
    $permission_db = $this->permissions;
    if(in_array($permission, $permission_db)) {
      return true;
    }

    return false;
  }

  // permission 是一個(gè)二維數(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);
  }
}

在數(shù)據(jù)庫中,我將二維數(shù)組存儲(chǔ)為json,利用laravel的Attribute的get和set方法,完成了數(shù)據(jù)庫中json和外界程序邏輯的連接。然后hasPermission就顯得很輕松了,直接判斷in_array就ok了。

后續(xù)

這個(gè)權(quán)限認(rèn)證的邏輯就清晰了。然后如果頁面中某個(gè)tab或者nav需要對(duì)不同權(quán)限的用戶展示,只需要在view中判斷

@if ($admin->hasPermission('admin.index')) 
@endif

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Laravel框架下載,安裝及路由操作圖文詳解

    Laravel框架下載,安裝及路由操作圖文詳解

    這篇文章主要介紹了Laravel框架下載,安裝及路由操作,結(jié)合實(shí)例形式詳細(xì)分析了laravel框架的下載、安裝、配置、路由等相關(guān)操作原理與使用技巧,需要的朋友可以參考下
    2019-12-12
  • php bcdiv和bcmul 函數(shù)的怪異現(xiàn)象

    php bcdiv和bcmul 函數(shù)的怪異現(xiàn)象

    這篇文章主要介紹了php bcdiv和bcmul 函數(shù)的怪異現(xiàn)象,本文通過實(shí)例代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • php文件上傳類的分享

    php文件上傳類的分享

    這篇文章主要為大家分享了php文件上傳類的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 解決laravel查詢構(gòu)造器中的別名問題

    解決laravel查詢構(gòu)造器中的別名問題

    今天小編就為大家分享一篇解決laravel查詢構(gòu)造器中的別名問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • 關(guān)于Curl在Swoole協(xié)程中的解決方案詳析

    關(guān)于Curl在Swoole協(xié)程中的解決方案詳析

    這篇文章主要給大家介紹了關(guān)于Curl在Swoole協(xié)程中的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Swoole具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • php獲取目標(biāo)函數(shù)執(zhí)行時(shí)間示例

    php獲取目標(biāo)函數(shù)執(zhí)行時(shí)間示例

    這篇文章主要介紹了php獲取目標(biāo)函數(shù)執(zhí)行時(shí)間示例,需要的朋友可以參考下
    2014-03-03
  • PHP使用JSON和將json還原成數(shù)組

    PHP使用JSON和將json還原成數(shù)組

    這篇文章主要介紹了PHP使用JSON和將json還原成數(shù)組的方法和示例分析,需要的朋友可以參考下
    2015-02-02
  • Laravel 前端資源配置教程

    Laravel 前端資源配置教程

    今天小編就為大家分享一篇Laravel 前端資源配置教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • Laravel異常上下文解決方案分享

    Laravel異常上下文解決方案分享

    異常處理是編程中十分重要但也最容易被人忽視的語言特性,下面這篇文章主要給大家介紹了關(guān)于Laravel異常上下文解決方案的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • Yii入門教程之目錄結(jié)構(gòu)、入口文件及路由設(shè)置

    Yii入門教程之目錄結(jié)構(gòu)、入口文件及路由設(shè)置

    本文從YII的目錄結(jié)構(gòu)開始分析,到入口文件分析,到路由設(shè)置詳解,視圖詳解,十分全面的向我們展示了YII框架的方方面面,是篇非常不錯(cuò)的文章,這里推薦給大家。
    2014-11-11

最新評(píng)論