본 글의 예시에서는 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 == '*') { 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']; } }
위의 미들웨어는 다음과 같습니다.
여기에는 모델 설계가 포함됩니다.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 = '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); } }
후속 조치
이 권한 인증의 논리는 명확합니다. 그런 다음 페이지의 탭이나 탐색을 다른 권한을 가진 사용자에게 표시해야 하는 경우 뷰에서
만 판단하여 사용자가 탭을 볼 수 있는지 확인하면 됩니다.@if ($admin->hasPermission('admin.index')) @endif
요약
이는 사용자 권한을 구현하는 것이 그리 복잡하지는 않지만 대부분의 백그라운드 요구 사항을 충족할 수 있다고 생각합니다. 물론 최적화할 수 있는 점이 많을 수 있습니다.
예를 들어 권한이 정규식을 지원할 수 있나요? hasPermission이 nosql이나 pg에 저장되어 있으면 직접 DB 요청을 수행할 필요가 없습니다. 허가 같은 것이 있는지?
이 글이 Laravel 프레임워크를 기반으로 하는 모든 분들의 PHP 프로그램 설계에 도움이 되기를 바랍니다.
Laravel5의 권한 관리 방법과 관련 글에 대한 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!