溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

利用laravel怎么實(shí)現(xiàn)一個(gè)用戶權(quán)限功能

發(fā)布時(shí)間:2021-02-08 15:09:15 來(lái)源:億速云 閱讀:128 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

今天就跟大家聊聊有關(guān)利用laravel怎么實(shí)現(xiàn)一個(gè)用戶權(quán)限功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(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è)頁(yè)面會(huì)觸發(fā),也可能在另外一個(gè)頁(yè)面觸發(fā),那么這個(gè)post請(qǐng)求就需要同時(shí)擁有兩個(gè)頁(yè)面路由的權(quán)限。

這里使用admin.validate的權(quán)限控制,這樣,可以將權(quán)限分組,admin都是關(guān)于admin相關(guān)的分組,在數(shù)據(jù)庫(kù)中,我就會(huì)存儲(chǔ)一個(gè)二維數(shù)組,[admin] => ['validate', 'index']; 存儲(chǔ)成二維數(shù)組而不是一維的好處呢,一般后臺(tái)展示是有兩個(gè)維度的,一個(gè)是頭部的tab欄,一個(gè)是左邊的nav欄,就是說(shuō)這個(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 "沒(méi)有權(quán)限,請(qǐng)聯(lián)系管理員";exit;
  }

  // 獲取當(dāng)前路由需要的權(quán)限
  public function getPermission($request)
  {
    $actions = $request->route()->getAction();
    if (empty($actions['permissions'])) {
      echo "路由沒(méi)有設(shè)置權(quán)限";exit;
    }
    return $actions['permissions'];
  }
}

這里最關(guān)鍵的就getPermission函數(shù),從$request->route()->getAction()來(lái)獲取出這個(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ù)庫(kù)中,我將二維數(shù)組存儲(chǔ)為json,利用laravel的Attribute的get和set方法,完成了數(shù)據(jù)庫(kù)中json和外界程序邏輯的連接。然后hasPermission就顯得很輕松了,直接判斷in_array就ok了。

后續(xù)

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

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

看完上述內(nèi)容,你們對(duì)利用laravel怎么實(shí)現(xiàn)一個(gè)用戶權(quán)限功能有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI