Laravel Gates(인터셉터)를 사용하면 사용자가 애플리케이션의 특정 영역에 액세스할 수 있는 권한을 부여할 수 있습니다. 애플리케이션에서 인터셉터를 쉽게 정의한 다음 이를 사용하여 액세스를 허용하거나 거부할 수 있습니다.
사용자 테이블에 admin
이라는 열이 있다고 가정합니다. 사용자가 관리자인지 여부에 따라 1
또는 0. 다음과 같은 간단한 확인을 통해 애플리케이션 모듈을 쉽게 보호할 수 있습니다. admin
的列,根据用户是否是管理员,它可以是 1
或 0
。我们可以通过如下简单的检查来轻松保护应用程序的一部分模块:
Route::get('administration', function(){ if(auth()->check() && auth()->user()->admin){ echo 'Welcome to the admin section'; } else { echo 'You shall not pass'; } });
如果特定用户的 admin
行设置为 1
,他们将看到以下输出。
否则,他们将看到以下内容:
这看上去很棒对吧!我们有一种简单的方法来允许或拒绝访问我们应用程序中的特定部分。然而问题是:如果整个应用程序中,有大量的位置要检查并修改用户访问权限怎么办。我们将不得不全局搜索代码并在每个地方修改这个逻辑。效率不是很高。
对此,我们可以定义一个 Gate(拦截器)并在整个应用程序中使用它。
要定义拦截器,可以打开 AppProvidersAuthServiceProvider.php
文件并在我们的 boot()
方法中添加以下内容:
public function boot() { $this->registerPolicies(); Gate::define('access-admin', function ($user) { return $user->admin; }); }
我们可以在整个应用中任何想验证管理员用户的地方使用这个拦截器。在下一节中,你将看到我们如何使用这个新的拦截器。
要使用拦截器,我们可以调用 Gate::allows()
或 Gate::denies()
方法,如下所示:
Route::get('administration', function(){ if (Gate::allows('access-admin')) { echo 'Welcome to the admin section'; } else { echo 'You shall not pass'; } });
请注意:
Gate::denies()
方法会对Gate::allows()
执行反向检查
拦截器的好处是我们现在可以随时更改我们的定义,授权逻辑会同步在整个应用程序中更改。
使用拦截器的另一个目的是检查与数据相关的权限。以博客为例,我们可以授予用户对他们创建的帖子的编辑权限。
我们可以将数据传递给拦截器以检查用户是否有权执行某项操作。
假设我们的应用程序有一个 Post 表,其中有一列 user_id
,其中包含创建它的用户的 ID。我们可以定义一个 Gate(拦截器)来确定用户是否可以像这样编辑特定的帖子:
Gate::define('edit-post', function ($user, $post) { return $user->id === $post->user_id; });
两个参数被传递给我们的拦截器定义。第一个是 $user
对象,其中包含经过身份验证的用户,第二个参数是我们的 $post
对象。
小Tips:如果没有经过身份验证的用户,拦截器将返回 false。
如果经过身份验证的用户是原始作者,拦截器将允许访问;否则将拒绝访问。
下面是一个快速示例,说明我们如何使用新的 edit-post
拦截器。
Route::get('edit/{id}', function($id){ $post = \App\Model\Post::find($id); if( Gate::allows('edit-post', $post) ){ echo 'You can edit this post'; } else { echo 'You shall not pass'; } });
上面,我们在示例中使用了 Route Closures,但我们可能希望将此路由映射到控制器。这也将让我们使用新的 Authorize 函数。
除了效率之外,使用拦截器的另一个原因是辅助函数。
假设我们将路由映射到控制器:
Route::get('edit/{id}', 'PostController@edit');
我们可以使用 authorize()
助手来检查经过身份验证的用户是否有权编辑帖子:
<?php namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request; class PostController extends Controller { public function edit($id){ $post = Post::find($id); $this->authorize('edit-post', $post); } }
如果控制器从 AppHttpControllersController
基类继承而来,你可以像使用 Gate::allow()
函数一样使用 authorize()
助手函数。
最后,如果我们想在视图中检查授权怎么办?我们可以使用 @can
Blade 函数助手来做到这一点。
假设 Blade 视图如下:
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1>{{ $post->title }}</h1> <p>{!! $post->body !!}</p>
我们可以使用 Blade 助手函数 @can
检查当前用户是否被允许编辑这篇文章:
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1>{{ $post->title }}</h1> <p>{!! $post->body !!}</p> @can('edit-post', $post) id }}">Edit Post @endcan
如果经过身份验证的用户是该帖子的原始作者,他们将看到一个编辑帖子按钮。
使用 @can
助手函数可以使我们的代码更易于阅读和管理。你也可以使用 @cannot
rrreee
admin
줄이 1
로 설정된 경우 다음이 표시됩니다. 산출. AppProvidersAuthServiceProvider.php
파일을 열고 boot()
메서드에 다음 콘텐츠를 추가하면 됩니다. 🎜rrreee🎜 관리자 사용자를 인증하려는 애플리케이션 전체의 어느 곳에서나 이 인터셉터를 사용할 수 있습니다. 다음 섹션에서는 이 새로운 인터셉터를 어떻게 사용하는지 살펴보겠습니다. 🎜🎜🎜인터셉터 사용🎜🎜🎜인터셉터를 사용하려면 다음과 같이 Gate::allows()
또는 Gate::denies()
메서드를 호출할 수 있습니다. 🎜rrreee🎜참고: Gate::denies()
메서드는 Gate::allows()
🎜🎜Interceptor에 대해 역방향 검사를 수행합니다. 이점은 다음과 같습니다. 이제 언제든지 정의를 변경할 수 있으며 인증 논리는 애플리케이션 전체에서 동기적으로 변경됩니다. 🎜🎜인셉터를 사용하는 또 다른 목적은 데이터와 관련된 권한을 확인하는 것입니다. 블로그를 예로 들면, 사용자가 작성한 게시물에 대한 편집 권한을 사용자에게 부여할 수 있습니다. 🎜🎜사용자에게 작업 수행 권한이 있는지 확인하기 위해 데이터를 인터셉터에 전달할 수 있습니다. 🎜🎜🎜인터셉터와 같은 데이터 전달🎜🎜🎜우리 애플리케이션에 이를 생성한 사용자의 🎜ID🎜가 포함된 user_id
열이 있는 🎜Post🎜 테이블이 있다고 가정합니다. Gate(인터셉터)를 정의하여 사용자가 다음과 같이 특정 게시물을 편집할 수 있는지 확인할 수 있습니다. 🎜rrreee🎜 두 개의 매개변수가 인터셉터 정의에 전달됩니다. 첫 번째는 인증된 사용자를 포함하는 $user
개체이고, 두 번째 매개변수는 $post
개체입니다. 🎜🎜팁: 인증된 사용자가 없으면 인터셉터는 false를 반환합니다. 🎜🎜인증된 사용자가 원본 작성자인 경우 인터셉터는 액세스를 허용하고, 그렇지 않으면 액세스를 거부합니다. 🎜🎜다음은 새로운
edit-post
인터셉터를 사용하는 방법에 대한 간단한 예입니다. 🎜rrreee🎜위의 예에서는 경로 폐쇄를 사용했지만 이 경로를 컨트롤러에 매핑하고 싶을 수도 있습니다. 이를 통해 새로운 🎜Authorize🎜 기능도 사용할 수 있습니다. 🎜🎜🎜Authorize Authorization Helper 함수 🎜🎜🎜효율성 외에도 인터셉터를 사용하는 또 다른 이유는 도우미 기능입니다. 🎜🎜경로를 컨트롤러에 매핑한다고 가정해 보겠습니다. 🎜rrreee🎜 authorize()
도우미를 사용하여 인증된 사용자에게 게시물 편집 권한이 있는지 확인할 수 있습니다. 🎜rrreee🎜컨트롤러가 다음에서 시작하는 경우 AppHttpControllersController
기본 클래스에서 상속되므로 Gate::allow()
함수와 마찬가지로 authorize()
도우미 함수를 사용할 수 있습니다. 🎜🎜마지막으로 권한을 뷰에서 확인하고 싶다면 어떻게 해야 할까요? @can
블레이드 함수 도우미를 사용하여 이 작업을 수행할 수 있습니다. 🎜🎜🎜뷰 레이어에서 인증🎜🎜🎜블레이드 뷰가 다음과 같다고 가정합니다: 🎜rrreee🎜블레이드 도우미 함수 @can
를 사용하여 현재 사용자가 이 글을 편집할 수 있는지 여부를 확인할 수 있습니다 : 🎜rrreee🎜게시물의 원래 작성자인 인증된 사용자에게는 🎜게시물 편집🎜 버튼이 표시됩니다. 🎜🎜@can
도우미 함수를 사용하면 코드를 더 쉽게 읽고 관리할 수 있습니다. @cannot
를 사용하여 반대의 작업을 수행할 수도 있습니다. 🎜🎜🎜Summary🎜🎜🎜다음은 Laravel 애플리케이션에서 Gates(인터셉터)를 사용하는 기본 사항입니다. 인터셉터를 사용하면 특정 사용자에게 애플리케이션 영역에 액세스할 수 있는 권한을 쉽게 부여할 수 있습니다. 이는 개체와 관련된 권한 목록인 🎜액세스 제어 목록🎜(ACL)이라고도 합니다. 🎜하지만 상황을 지나치게 복잡하게 해서는 안 됩니다... 가장 간단한 시나리오에서는 인터셉터를 사용하여 액세스를 허용하거나 거부합니다. 사용자는 인증을 허용하거나 거부할 수 있습니다.
이 튜토리얼은 사용자를 통과시키는 것이 아니라 통과시키는 것에 관한 것이기 때문에 반지의 제왕에 나오는 간달프의 이미지(수동 개 머리)를 보내는 것이 합리적입니다.
Laravel Gates(인터셉터)에 대해 자세히 알아보려면 Laravel 인증 문서를 참조하세요.
영어 원문 주소: https://devdojo.com/tnylea/laravel-gates
번역 주소: https://learnku.com/laravel/t/67585
[관련 권장 사항: laravel 비디오 튜토리얼 】
위 내용은 Laravel의 인터셉터(Gates)에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!