이 기사에서 공유한 내용은 Laravel 5.1 프레임워크에서 ACL 사용자 인증 및 권한 확인 기능을 구현하는 것에 관한 것입니다. 이는 특정 참조 가치가 있으며 도움이 필요한 친구들에게 도움이 되기를 바랍니다.
1. 소개
Laravel에서 제공하는 기본 인증 기능을 통해 사용자 등록, 로그인, 로그아웃 및 비밀번호 재설정이 편리하고 간단해집니다.
그러나 사이트의 특정 부분에 대한 액세스를 제어해야 하거나 관리자가 아닌 사람이 특정 페이지를 열거나 닫을 수 있도록 허용하거나 특정 사용자가 자신이 게시한 내용(예: 기사)만 편집할 수 있도록 해야 하는 경우 다음을 도입해야 합니다. BeatSwitch Lock 도구와 같은 도구를 사용하거나 수동으로 이러한 기능을 직접 작성하세요. 우리는 이러한 기능을 ACL(액세스 제어 목록)이라고 부르며, 사용자 기록 속성을 기반으로 특정 항목을 조작하거나 볼 수 있는 사용자 권한을 정의하는 데 사용됩니다.
다행히도 Laravel 5.1.11부터 Laravel은 위의 요구 사항을 충족할 수 있는 기본 인증 기능을 제공하므로 더 이상 추가 작업을 수행할 필요가 없습니다.
참고: 이 섹션을 시작하기 전에 업그레이드 가이드를 참조하여 Laravel을 Laravel 5.1.11로 업그레이드하세요. 그렇지 않으면 관련 기능이 구현되지 않습니다.
2. 무엇을 할 수 있나요?
Laravel에서 제공하는 기본 ACL을 Gate라고 합니다(Spark와 같은 제품 이름이 아니라 클래스 이름과 Facade 이름일 뿐입니다).
Gate 클래스(삽입 또는 Gate 파사드 사용)를 사용하면 특정 사용자(현재 로그인한 사용자 또는 지정된 사용자)가 특정 작업을 수행할 수 있는지 여부를 쉽게 확인할 수 있습니다. 확인 코드는 다음과 같습니다.
if (Gate::denies('update-post', $post)) { abort(403); }
이 코드를 컨트롤러에 넣으면 정의된 update-post 규칙을 사용하여 현재 인증된 사용자에게 지정된 기사를 업데이트할 수 있는 권한이 있는지 확인합니다.
denies 방식의 반대인 Gate::allows를 사용할 수도 있고, Blade 뷰 템플릿에서 @can을 통해서도 사용할 수 있으며, 그 외에도 더 많은 것들이 있으니 다음에서 살펴보겠습니다.
3. 사용 방법은?
Laravel ACL은 "권한" 개념을 기반으로 구축되었습니다. 권한에는 true 또는 false를 반환하는 키(예: 업데이트 게시)와 클로저(매개변수 전달 가능)가 포함됩니다.
3.1 권한 정의
AuthServiceProvider에서 사용자 업데이트 게시 권한 update-post를 다음과 같이 정의하겠습니다.
<?php namespace App\Providers; use Illuminate\Contracts\Auth\Access\Gate as GateContract; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider{ /** * 注册应用所有的认证/授权服务. * * @param \Illuminate\Contracts\Auth\Access\Gate $gate * @return void */ public function boot(GateContract $gate) { parent::registerPolicies($gate); $gate->define('update-post', function ($user, $post) { return $user->id === $post->user_id; }); } }
보시다시피 권한 폐쇄를 정의하는 첫 번째 매개변수는 지정된 사용자입니다. 로그인 인증이 통과되지 않으면 Gate는 자동으로 false를 반환합니다.
물론 클로저 외에도 컨테이너에서 구문 분석되는 두 번째 매개변수인 클래스 메소드로 클로저를 대체할 수도 있습니다.
$gate->define('update-post', 'PostPolicy @update ');
3.2 Gate 파사드를 통해 권한 확인
Gate는 권한 확인을 위해 다음과 같은 방법을 제공합니다: 확인, 허용 및 거부 기능은 완전히 동일하지만 거부 및 허용 기능은 반대입니다. .
Facade를 사용하여 권한을 확인하는 경우 사용자 인스턴스를 전달할 필요가 없습니다. Gate Facade는 자동으로 현재 사용자를 전달합니다.
if (Gate::denies('update-post', $post)) { abort(403); }
권한에 여러 매개변수를 정의하는 경우:
Gate::define('delete-comment', function ($user, $post, $comment) { // });
확인 방법
if (Gate::allows('delete-comment', [$post, $comment])) { // }
현재 인증되지 않은 사용자에게 조작 권한이 있는지 확인하고 싶은 경우 호출 방법은 다음과 같습니다.
if (Gate::forUser($user)->allows('update-post', $post)) { // }
3.3 Gate 주입을 사용하여 권한을 확인합니다
늘 그렇듯이 다음과 같이 할 수 있습니다. Facade를 사용하는 대신 Gate 클래스를 주입하십시오. 주입된 클래스는 귀하의 것과 동일합니다. AuthServiceProvider와 동일합니다 - IlluminateContractsAuthAccessGate:
public function somethingResolvedFromContainer(Gate $gate) { if ($gate->denies('update-post')) { // etc. } }
3.4 사용자 모델을 사용하여 권한을 확인하세요.
Laravel의 AppUser 모델은 이제 Authorizedtrait를 사용합니다. Gate의 허용 및 거부 방법에 각각 해당하는 can 및 not 메소드를 사용할 수 있습니다.
따라서 사용자 모델을 사용하여 권한을 확인할 수도 있습니다.
public function update(Request $request, $id) { $post = Post::findOrFail($id); if ($request->user()->cannot('update-post', $post)) { abort(403); } // 更新文章... }
3.5 Blade에서 권한 확인
Blade에서 @can 지시문을 사용하여 권한을 확인할 수 있습니다.
<a href="/post/{{ $post->id }}">查看文章</a> @can('update-post', $post) <a href="/post/{{ $post->id }}/edit">编辑文章</a> @endcan
반대는 @else 지시문입니다.
@can('update-post', $post) <!-- The Current User Can Update The Post --> @else <!-- The Current User Can't Update The Post --> @endcan
3.6 권한 확인 취소
관리자 또는 슈퍼유저에게 모든 권한이 있는 경우 어떻게 해야 하나요? 아니면 사용자를 위해 ACL 논리를 일시적으로 전환하려면 어떻게 해야 합니까?
Gate에서 제공하는 before 메소드를 사용하면 특정 상황에서 권한을 추가로 확인하지 않고 다른 확인을 수행하기 전에 돌아갈 수 있습니다.
$gate->before(function ($user, $ability) { if ($user->last_name === 'Stauffer') { return true; } });
또는 사용자가 직접 사용하는 경우:
$gate->before(function ($user, $ability) { if ($user->isOwner()) { return true; } });
3.7 전략 클래스
적합한 애플리케이션 논리 점점 더 복잡해지고 점점 더 많은 권한을 처리해야 하기 때문에 AuthServiceProvider에서 모든 권한을 정의하는 것은 분명히 현명한 생각이 아닙니다. 따라서 Laravel은 전략 클래스를 일부 기본 PHP 클래스로 소개하며 컨트롤러는 유사 기반입니다. 리소스 그룹이 리소스를 기반으로 권한을 그룹화하고 정책 클래스를 라우팅하는 방법에 대해 설명합니다.
정책 클래스 생성
다음 Artisan 명령을 사용하여 PostPolicy 정책 클래스를 생성할 수 있습니다:
php artisan make:policy PostPolicy
생성된 정책 클래스는 app/Policies 디렉터리에 있습니다.
그런 다음 AuthServiceProvider의 정책 속성에 정책 클래스를 등록할 수 있습니다.
protected $policies = [ Post::class => PostPolicy::class, ];
아래에서는 PostPolicy를 다음과 같이 편집합니다.
<?php namespace App\Policies; use App\User; use App\Post; class PostPolicy{ /** * 判断给定文章是否可以被给定用户更新 * * @param \App\User $user * @param \App\Post $post * @return bool */ public function update(User $user, Post $post) { return $user->id === $post->user_id; } }
참고: 모든 정책 클래스는 서비스 컨테이너를 통해 해결됩니다. 정책 클래스 Type의 생성자는 모든 종속성을 암시하며 자동으로 주입됩니다.
전략 확인
如果为某个资源类型定义了策略类,Gate将会使用第一个参数来判断检查策略类上的哪个方法。
因此,要检查是否有权限更新某篇文章,只需要传入文章实例和update权限:
<?php namespace App\Http\Controllers; use Gate; use App\User; use App\Post; use App\Http\Controllers\Controller; class PostController extends Controller{ /** * 更新给定文章 * * @param int $id * @return Response */ public function update($id) { $post = Post::findOrFail($id); if (Gate::denies('update', $post)) { abort(403); } // 更新文章... } }
当然也可以使用User模型和Blade指令检查权限。
此外,Laravel还提供了一个全局帮助函数policy来检查权限:
if (policy($post)->update($user, $post)) { // }
3.8 控制器授权
由于大多数授权都会在检查权限失败的情况下退出控制器方法,因此在控制器中检查权限有一条捷径(AuthorizesRequeststrait提供,该trait在基类控制器Controller中被使用):
<?php namespace App\Http\Controllers; use App\Post; use App\Http\Controllers\Controller; class PostController extends Controller{ /** * 更新给定文章 * * @param int $id * @return Response */ public function update($id) { $post = Post::findOrFail($id); $this->authorize('update', $post); // 更新文章... } }
和我们上面的例子一样,如果授权失败会抛出403错误。
最后,如果你的控制器方法名和策略类中的方法名相同,例如都是update,则可以省略authorize的第一个参数:
public function update($id){ $post = Post::findOrFail($id); $this->authorize($post); // 更新文章... }
此外,AuthorizesRequests也提供了对非当前认证用户权限检查的支持:
$this->authorizeForUser($user, 'update', $post);
相关文章推荐:
Laravel 5.1框架中如何创建自定义Artisan控制台命令
相关课程推荐:
위 내용은 Laravel 5.1 프레임워크에서 ACL 사용자 인증 및 권한 확인 기능 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!