Laravel 5 권한 관리 방법 상세 설명

6154 단어 Laravel5권한 관리
본 고 는 Laravel 5 권한 관리의 실현 방법 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
권한 관리 에 대한 사고
최근 에 laravel 로 백 엔 드 를 설 계 했 는데 백 엔 드 를 관리 할 수 있 는 권한 이 필요 합 니 다.권한 관 리 는 실질 적 으로 두 부분 으로 나 뉘 는데 먼저 인증 이 고 그 다음 에 권한 이다.인증 부분 이 아주 좋 습 니 다.바로 관리자 가 로그 인하 고 session 을 기록 하 는 것 입 니 다.이 laravel 에 도 Auth 를 가지 고 이 를 실현 합 니 다.가장 번 거 로 운 것 은 권한 인증 이다.
권한 인증 은 본질 적 으로 누가 무언 가 를 관리 할 수 있 는 권한 이 있 는 것 이다.여기 에는 두 가지 차원 이 있 습 니 다.누가 사용자 차원 입 니까?사용자 차원 에서 권한 관리의 입 도 는 사용자 혼자 일 수도 있 고 사용 자 를 그룹 으로 나 눌 수도 있 습 니 다.사용 자 를 그룹 으로 나 누 면 관련 된 논 리 는 한 사용자 가 여러 그룹 에 있 을 수 있 습 니까?다른 한편,무엇 을 관리 하 는 지,이것 은 사물 의 차원 이 고,한 페이지 는 하나의 물건 이 며,한 페이지 의 한 요소 도 하나의 물건 이거 나,크게 말하자면 하나의 기능 은 하나의 물건 이다.그래서 권한 관 리 를 하 는 데 가장 중요 한 것 은 이 두 차원 의 입 도 를 확인 하 는 것 이다.이것 은 이미 기술적 인 일이 아니 니,이것 은 토론 이 필요 한 것 이다.
위의 사 고 를 바탕 으로 제 가 이번에 하고 싶 은 권한 관 리 는 사용자 차원 에서 개인 을 바탕 으로 합 니 다.모든 사람의 권한 이 다르다 는 것 이다.동서 의 차원 에서 저 는 길 을 가장 작은 단위 로 설정 합 니 다.즉,하나의 경로 에 권한 관 리 를 설정 할 수 있 습 니 다.
아래 의 사 고 는 권한 을 표시 하 는 것 입 니 다.위 치 를 사용 할 수도 있 고 문 자 를 사용 할 수도 있 으 며 정형 을 사용 할 수도 있 습 니 다.나중에 저 는 문 자 를 선 택 했 습 니 다.두 가지 고려 를 바탕 으로 1 문 자 는 알 기 쉽 고 데이터 베이스 에서 찾 는 것 도 편리 합 니 다.2 저 는 특정한 권한 에 따라 이 권한 을 가 진 사람의 수 요 를 찾 지 않 았 습 니 다.즉,반 검색 수요 가 없고 사용 위치,정형 등 이 모두 의미 가 크 지 않 습 니 다.
다음은 laravel 과 어떻게 결합 할 것 인 가 를 고려 합 니 다.모든 경로 에 접근 권한 을 설정 하려 면 laravel 의 route.phop 경로 관리 에서 설정 하고 싶 습 니 다.가장 좋 은 것 은 Route::get 일 때 permission 를 설정 할 수 있 는 인자 가 있 습 니 다.이렇게 하 는 장점 은 권한 설정 이 간단 하 다 는 것 이다.루트 를 결정 할 때 권한 제 어 를 손 쉽게 썼 다.나 쁜 점도 분명 하 다.laravel 경로 의 세 가지 방식 은 한 가지 만 쓸 수 있다.바로 Route:(method)이런 방식 입 니 다.
기본적으로 결정 되면 일 을 시작한다.
경로 설계
기본 적 인 길 은 이렇다.
Route::post('/admin/validate', ['uses' => 'AdminController@postValidate', 'permissions'=>['admin.validate', 'admin.index']]);
여기 서 기본 적 인 경로 action 을 제정 한 후에 permissions 의 속성 을 설정 합 니 다.이 속성 은 배열 로 설계 되 었 습 니 다.예 를 들 어 하나의 post 요청 은 특정한 페이지 에서 실 행 될 수도 있 고 다른 페이지 에서 실 행 될 수도 있 습 니 다.그러면 이 post 요청 은 두 페이지 의 경로 권한 을 동시에 가 져 야 합 니 다.
여기 서 admin.vaidate 의 권한 통 제 를 사용 합 니 다.이렇게 하면 권한 을 그룹 으로 나 눌 수 있 습 니 다.admin 은 모두 admin 과 관련 된 그룹 입 니 다.데이터베이스 에 저 는 2 차원 배열,[admin]=>['vaidate','index']를 저장 합 니 다.1 차원 이 아 닌 2 차원 배열 로 저장 하 는 것 이 좋 습 니 다.보통 배경 전 시 는 두 가지 차원 이 있 습 니 다.하 나 는 머리의 tab 표시 줄 이 고 하 나 는 왼쪽 의 nav 표시 줄 입 니 다.즉,이 2 차원 배열 과 배경 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(admin−>hasPermission(permit);

이것 은 모델 의 디자인 과 관련된다.
모델 디자인

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

데이터베이스 에서 저 는 2 차원 배열 을 json 으로 저장 하고 laravel 의 Attribute 의 get 과 set 방법 을 이용 하여 데이터 베이스 에서 json 과 외부 프로그램 논리 적 연결 을 완 성 했 습 니 다.그리고 hasPermission 은 가 벼 워 보 입 니 다.바로 in 을 판단 합 니 다.array 는 OK.
후속
이 권한 인증 의 논 리 는 분명 해 졌 다.그리고 페이지 에 있 는 tab 나 nav 가 서로 다른 권한 을 가 진 사용자 에 게 보 여 주 려 면 view 에서 판단 해 야 합 니 다.

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

이 사용자 가 이 tab 를 볼 수 있 는 지 여 부 를 판단 할 수 있 습 니 다.
총결산
이것 은 복잡 하지 않 은 사용자 권한 실현 이지 만,나 는 이미 대부분의 배경 수 요 를 만족 시 킬 수 있 을 것 이 라 고 생각한다.물론 최적화 할 수 있 는 점 은 많 을 수 있 지만,
예 를 들 어 permission 은 정규 를 지원 할 수 있 습 니까?hasPermission 은 nosql 이나 pg 에 저장 되 어 있 으 면 json 의 데이터 분석 을 하지 않 고 DB 요청 만으로 permission 이 있 는 지 판단 할 수 있 습 니까?
더 많은 Laravel 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.,,,,,,및,
본 고 는 Laravel 프레임 워 크 를 바탕 으로 하 는 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기