Laravel의 인터셉터(Gates)에 대해 이야기해 보겠습니다.

青灯夜游
풀어 주다: 2022-09-29 20:51:16
앞으로
1676명이 탐색했습니다.

Laravel의 인터셉터(Gates)에 대해 이야기해 보겠습니다.

Laravel Gates(인터셉터)를 사용하면 사용자가 애플리케이션의 특정 영역에 액세스할 수 있는 권한을 부여할 수 있습니다. 애플리케이션에서 인터셉터를 쉽게 정의한 다음 이를 사용하여 액세스를 허용하거나 거부할 수 있습니다.

간단한 예

사용자 테이블에 admin이라는 열이 있다고 가정합니다. 사용자가 관리자인지 여부에 따라 1 또는 0. 다음과 같은 간단한 확인을 통해 애플리케이션 모듈을 쉽게 보호할 수 있습니다. admin 的列,根据用户是否是管理员,它可以是 10。我们可以通过如下简单的检查来轻松保护应用程序的一部分模块:

Route::get('administration', function(){
    if(auth()->check() && auth()->user()->admin){
        echo 'Welcome to the admin section';
    } else {
        echo 'You shall not pass';
    }
});
로그인 후 복사

如果特定用户的 admin 行设置为 1 ,他们将看到以下输出。

Admin access screenshot

否则,他们将看到以下内容:

Admin denied access

这看上去很棒对吧!我们有一种简单的方法来允许或拒绝访问我们应用程序中的特定部分。然而问题是:如果整个应用程序中,有大量的位置要检查并修改用户访问权限怎么办。我们将不得不全局搜索代码并在每个地方修改这个逻辑。效率不是很高。

对此,我们可以定义一个 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 函数。

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  助手函数可以使我们的代码更易于阅读和管理。你也可以使用 @cannotrrreee

특정 사용자의 admin 줄이 1 로 설정된 경우 다음이 표시됩니다. 산출.

관리자 액세스 스크린샷

그렇지 않으면 다음 콘텐츠:

관리자 액세스 거부

이 내용은 다음과 같습니다. 좋아요, 그렇죠? 애플리케이션의 특정 부분에 대한 액세스를 허용하거나 거부하는 쉬운 방법이 있습니다. 그러나 문제는 애플리케이션 전체에서 사용자 액세스 권한을 확인하고 수정해야 하는 곳이 많다면 어떻게 될까요? 우리는 코드를 전역적으로 검색하고 이 논리를 모든 곳에서 수정해야 합니다. 별로 효율적이지 않습니다. 🎜🎜이를 위해 Gate(인터셉터)를 정의하고 이를 애플리케이션 전체에서 사용할 수 있습니다. 🎜🎜🎜인터셉터 정의🎜🎜🎜인터셉터를 정의하려면 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 Gates(인터셉터)에 대해 자세히 알아보려면 Laravel 인증 문서를 참조하세요.

영어 원문 주소: https://devdojo.com/tnylea/laravel-gates

번역 주소: https://learnku.com/laravel/t/67585

[관련 권장 사항: laravel 비디오 튜토리얼

위 내용은 Laravel의 인터셉터(Gates)에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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