> php教程 > PHP视频 > Laravel5 권한 관리 방법에 대한 자세한 설명

Laravel5 권한 관리 방법에 대한 자세한 설명

高洛峰
풀어 주다: 2016-12-23 17:27:10
원래의
1440명이 탐색했습니다.

본 글의 예시에서는 Laravel5 권한 관리 구현 방법을 설명합니다. 참고하실 수 있도록 공유해 드리며 자세한 내용은 다음과 같습니다.

권한 관리에 대한 생각

최근에 laravel을 사용하여 백엔드를 설계했는데, 백엔드에는 권한 관리가 필요합니다. 권한 관리는 기본적으로 첫 번째 인증과 권한의 두 부분으로 나뉩니다. 인증 부분은 매우 쉽습니다. 즉, 관리자가 로그인하여 세션을 기록하는 것입니다. Laravel에는 이를 구현하기 위한 Auth도 함께 제공됩니다. 가장 귀찮은 것은 권한 인증이다.

권한 인증은 본질적으로 누가 무엇을 관리할 수 있는 권한을 가지고 있는지를 의미합니다. 여기에는 두 가지 차원이 있습니다. 사용자 차원에서는 권한 관리의 세분성이 한 명의 사용자일 수도 있고, 사용자가 그룹화되는 경우 한 명의 사용자가 여러 그룹에 포함될 수도 있습니다. ? 반면, 무언가를 관리할 때 이것은 사물의 차원을 가지고 있습니다. 페이지도 사물이고, 페이지의 요소도 사물입니다. 더 넓게 말하면 기능도 사물입니다. 따라서 권한 관리에서 가장 중요한 것은 이 두 가지 차원의 세분성을 확인하는 것입니다. 이는 더 이상 기술적인 문제가 아니며 논의가 필요합니다.

위의 생각을 바탕으로 제가 이번에 하려는 권한 관리는 사용자 차원에서 개인을 기반으로 합니다. 단지 모든 사람의 권한이 다를 뿐입니다. East-West 차원에서는 경로를 가장 작은 단위로 설정합니다. 즉, 단일 경로에 대한 권한 관리를 설정합니다.

권한을 표시하는 방법은 다음과 같습니다. 비트, 문자 또는 정수를 사용할 수 있습니다. 나중에 저는 두 가지 고려 사항을 바탕으로 캐릭터를 선택했습니다. 1. 캐릭터가 이해하기 쉽고 데이터베이스에서 검색하기 쉽습니다. 2. 특정 권위에 따라 이 권한을 가진 사람을 검색할 필요가 없었습니다. 비트를 사용하면 전체 유형 등이 거의 중요하지 않습니다.

기본적으로 결정이 되었으면 시작해 보겠습니다.

라우팅 설계

기본 라우팅은 이렇습니다

여기서는 기본 라우팅 액션을 설정한 후 권한 속성을 다음과 같이 설계합니다. 예를 들어 게시물 요청이 특정 페이지나 다른 페이지에서 트리거될 수 있으므로 이 게시물 요청에는 두 페이지 모두의 라우팅 권한이 있어야 합니다.
Route::post('/admin/validate', ['uses' => 'AdminController@postValidate', 'permissions'=>['admin.validate', 'admin.index']]);
로그인 후 복사

여기서는 admin.validate의 권한 제어를 사용합니다. 이런 식으로 권한을 그룹화할 수 있습니다. admin은 데이터베이스에 2차원 배열인 [admin]을 저장합니다. ] => ['validate', 'index']; 일반적으로 1차원이 아닌 2차원 배열로 저장하면 어떤 이점이 있나요? 다른 하나는 왼쪽의 탐색 모음입니다. 즉, 이 2차원 배열은 배경의 탭 및 탐색 열과 일대일 대응을 갖습니다.

미들웨어 디자인

자, 이제 미들웨어를 설치하고 이 미들웨어를 사용할 모든 경로를 설정하겠습니다

여기서 가장 중요한 것은 getPermission 함수가 $request->route()->getAction()에서 이 경로의 작업 정의를 수행한 다음 권한 필드에서 Route.php에 정의된 라우팅 권한을 얻습니다.
<?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 == &#39;*&#39;) {
        return $next($request);
      }
      if ($admin->hasPermission($permit)) {
        return $next($request);
      }
    }
    echo "没有权限,请联系管理员";exit;
  }
  // 获取当前路由需要的权限
  public function getPermission($request)
  {
    $actions = $request->route()->getAction();
    if (empty($actions[&#39;permissions&#39;])) {
      echo "路由没有设置权限";exit;
    }
    return $actions[&#39;permissions&#39;];
  }
}
로그인 후 복사

위의 미들웨어는 다음과 같습니다.

여기에는 모델 설계가 포함됩니다.
admin−>hasPermission(admin−>hasPermission(permit);
로그인 후 복사

모델 설계

데이터베이스에는 2차원 배열을 json으로 저장하고, laravel의 Attribute get 및 set 메소드를 사용하여 데이터베이스와 외부에 json 통합을 완료했습니다. 프로그램 논리. 그렇다면 hasPermission은 매우 쉬운 것 같습니다. in_array를 직접 판단하면 괜찮을 것입니다.
<?php namespace App\Models\Admin;
use App\Models\Model as BaseModel;
class Admin extends BaseModel {
  protected $table = &#39;admin&#39;;
  // 判断是否有某个权限
  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(&#39;.&#39;, $item);
      if (count($keys) != 2) {
        continue;
      }
      $ret[$keys[0]][] = $keys[1];
    }
    $this->attributes[&#39;permissions&#39;] = json_encode($ret);
  }
}
로그인 후 복사

후속 조치

이 권한 인증의 논리는 명확합니다. 그런 다음 페이지의 탭이나 탐색을 다른 권한을 가진 사용자에게 표시해야 하는 경우 뷰에서

만 판단하여 사용자가 탭을 볼 수 있는지 확인하면 됩니다.
@if ($admin->hasPermission(&#39;admin.index&#39;))
@endif
로그인 후 복사

요약

이는 사용자 권한을 구현하는 것이 그리 복잡하지는 않지만 대부분의 백그라운드 요구 사항을 충족할 수 있다고 생각합니다. 물론 최적화할 수 있는 점이 많을 수 있습니다.

예를 들어 권한이 정규식을 지원할 수 있나요? hasPermission이 nosql이나 pg에 저장되어 있으면 직접 DB 요청을 수행할 필요가 없습니다. 허가 같은 것이 있는지?


이 글이 Laravel 프레임워크를 기반으로 하는 모든 분들의 PHP 프로그램 설계에 도움이 되기를 바랍니다.

Laravel5의 권한 관리 방법과 관련 글에 대한 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿