>백엔드 개발 >PHP 튜토리얼 >Laravel의 게이트와 전략

Laravel의 게이트와 전략

WBOY
WBOY원래의
2023-08-31 13:49:061544검색

Laravel의 게이트와 전략

오늘은 Laravel 웹 프레임워크의 인증 시스템에 대해 알아보겠습니다. Laravel 프레임워크는 게이트와 정책의 형태로 인증을 구현합니다. 게이트와 전략을 소개한 후 사용자 정의 예제를 구현하여 개념을 보여드리겠습니다.

인증 개념을 이해하는 데 필요하므로 내장된 Laravel 인증 시스템에 대해 이미 알고 있다고 가정합니다. 분명히 인증 시스템은 인증 시스템과 함께 작동하여 합법적인 사용자 세션을 식별합니다.

Laravel 인증 시스템에 대해 모르신다면 공식 문서를 읽어 보시기를 적극 권장합니다. 이를 통해 해당 주제에 대한 심층적인 이해를 얻을 수 있을 것입니다.

Laravel 인증 방법

지금쯤이면 Laravel 인증 시스템이 게이트와 정책이라는 두 가지 형태로 제공된다는 점을 아셔야 합니다. 이것이 복잡한 것처럼 들릴 수도 있지만, 일단 익숙해지면 꽤 쉽게 할 수 있다고 말하고 싶습니다!

Gate를 사용하면 간단한 폐쇄 기반 접근 방식을 사용하여 인증 규칙을 정의할 수 있습니다. 즉, 특정 모델에 연결되지 않은 작업을 승인하려는 경우 게이트는 해당 논리를 구현하기에 완벽한 장소입니다.

게이트 기반 인증이 어떤 것인지 간단히 살펴보겠습니다.

으아아아

위의 코드 조각은 인증 규칙을 정의합니다. update-post 애플리케이션의 어느 곳에서나 이를 호출할 수 있습니다.

반면에 어떤 모델에 대한 인증 논리를 그룹화하려면 전략을 사용해야 합니다. 예를 들어 애플리케이션에 Post 모델이 있고 해당 모델에 대한 CRUD 작업을 승인하려고 한다고 가정해 보겠습니다. 이 경우 구현해야 할 전략은 다음과 같습니다.

으아아아

보시다시피 이는 Post 모델에서 CRUD 작업에 대한 인증을 정의하는 매우 간단한 정책 클래스입니다.

이상으로 Laravel의 게이트와 전략에 대한 소개입니다. 다음 섹션부터 각 요소에 대한 실제적인 데모를 제공하겠습니다.

이번 섹션에서는 실제 사례를 통해 문의 개념을 이해해 보겠습니다.

맞춤형 문 만드는 방법

컴포넌트나 서비스를 등록해야 할 때 일반적으로 Laravel 서비스 제공업체를 찾습니다. 해당 규칙에 따라 다음 코드 조각에 표시된 대로 app/Providers/AuthServiceProvider.php에서 사용자 정의 게이트를 정의해 보겠습니다.

으아아아

boot 메서드에서 맞춤 문을 정의합니다.

으아아아

게이트를 정의할 때 게이트 정의에 정의된 인증 논리에 따라 TRUEFALSE를 반환하는 클로저가 필요합니다. 클로저 기능 외에도 게이트를 정의하는 다른 방법이 있습니다.

예를 들어 다음 게이트 정의는 폐쇄 함수 대신 컨트롤러 작업을 호출합니다.

으아아아

맞춤 게이트 사용 방법

이제 게이트 기반 승인이 어떻게 작동하는지 보여줄 수 있도록 사용자 지정 경로를 추가해 보겠습니다. 경로 파일 routes/web.php에 다음 경로를 추가합니다.

으아아아

관련 컨트롤러 파일 app/Http/Controllers/PostController.php도 만들어 보겠습니다.

으아아아

대부분의 경우 허용 또는 거부 방법을 사용하게 됩니다(Gate 모양) 특정 작업을 승인합니다. 위의 예에서는 <code class="inline">allows 메서드를 사용하여 현재 사용자가 allowsdenies 方法(Gate 外观)来授权特定操作。在上面的示例中,我们使用 allows 方法来检查当前用户是否能够执行 update-post 작업을 수행할 수 있는지 확인합니다.

눈이 예리한 사용자는 두 번째 매개변수 $post 传递给了闭包。第一个参数是当前登录的用户,由 Gatefacade만 자동으로 주입한다는 것을 알 수 있습니다.

Laravel 애플리케이션에서 게이트를 사용하여 작업을 승인하는 방법은 다음과 같습니다. 모델에 대한 인증을 구현하려는 경우 다음 섹션에서 정책 사용 방법을 설명합니다.

정책

앞서 논의한 것처럼 특정 모델이나 리소스에 대한 권한 부여 작업을 논리적으로 그룹화하려는 경우 필요한 것은 정책입니다.

맞춤 전략을 만드는 방법

이 섹션에서는 모든 CRUD 작업을 승인하는 Post 模型创建一个策略,用于授权所有 CRUD 操作。我假设您已经在应用程序中实现了 Post 모델에 대한 정책을 만듭니다. 나는 당신이 이미 애플리케이션에

모델을 구현했다고 가정합니다. 그렇지 않으면 비슷한 일이 일어날 것입니다.

artisan 命令是创建存根代码时最好的朋友。您可以使用以下 artisan 命令为 PostLaravel artisan 명령은 스텁 코드를 생성할 때 가장 좋은 친구입니다. 다음 artisan 명령을 사용하여

모델에 대한 전략을 생성할 수 있습니다.

으아아아 --model=Post보시다시피 모든 CRUD 메소드를 생성할 수 있도록 매개변수를 제공합니다. 그렇지 않은 경우 빈 정책 클래스가 생성됩니다. app/Policies/PostPolicy.php

에서 새로 생성된 정책 클래스를 찾을 수 있습니다.

으아아아

다음 코드로 바꿔보겠습니다.

으아아아

전략 클래스를 사용하려면 다음 코드 조각과 같이 Laravel 서비스 공급자에 등록해야 합니다.

으아아아 $policies

속성에 정책 매핑을 추가했습니다. CRUD 작업을 승인하기 위해 적절한 정책 메소드를 호출하도록 Laravel에 지시합니다. 🎜

您还需要使用 registerPolicies 方法注册策略,就像我们在 boot 方法中所做的那样。

没有模型的策略方法

PostPolicy 策略类中的 create 方法仅采用单个参数,这与采用两个参数的其他模型方法不同。一般来说,第二个参数是模型对象,您将在执行授权时使用它。但是,在 create 方法的情况下,您只需要检查是否允许相关用户创建新帖子。

在下一节中,我们将了解如何使用自定义策略类。

如何使用我们的自定义策略类

更进一步,让我们在 routes/web.php 文件中创建几个自定义路由,以便我们可以在那里测试我们的策略方法。

Route::get('service/post/view', 'PostController@view');
Route::get('service/post/create', 'PostController@create');
Route::get('service/post/update', 'PostController@update');
Route::get('service/post/delete', 'PostController@delete');

最后,让我们在 app/Http/Controllers/PostController.php 创建一个关联的控制器。

<?php
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use App\Post;
use Illuminate\Support\Facades\Auth;
 
class PostController extends Controller
{
  public function view()
  {
    // get current logged in user
    $user = Auth::user();
     
    // load post
    $post = Post::find(1);
     
    if ($user->can('view', $post)) {
      echo "Current logged in user is allowed to update the Post: {$post->id}";
    } else {
      echo 'Not Authorized.';
    }
  }
 
  public function create()
  {
    // get current logged in user
    $user = Auth::user();
 
    if ($user->can('create', Post::class)) {
      echo 'Current logged in user is allowed to create new posts.';
    } else {
      echo 'Not Authorized';
    }
 
    exit;
  }
 
  public function update()
  {
    // get current logged in user
    $user = Auth::user();
 
    // load post
    $post = Post::find(1);
 
    if ($user->can('update', $post)) {
      echo "Current logged in user is allowed to update the Post: {$post->id}";
    } else {
      echo 'Not Authorized.';
    }
  }
 
  public function delete()
  {
    // get current logged in user
    $user = Auth::user();
     
    // load post
    $post = Post::find(1);
     
    if ($user->can('delete', $post)) {
      echo "Current logged in user is allowed to delete the Post: {$post->id}";
    } else {
      echo 'Not Authorized.';
    }
  }
}

您可以通过不同的方式使用策略来授权您的操作。在上面的示例中,我们使用 User 模型来授权我们的 Post 模型操作。

User 模型提供了两种有用的授权方法 — cancantcan 方法用于检查当前用户是否能够执行某个操作。而与 can 方法对应的 cant 方法,用于判断动作是否无法执行。

让我们从控制器中获取 view 方法的片段,看看它到底做了什么。

public function view()
{
  // get current logged in user
  $user = Auth::user();
   
  // load post
  $post = Post::find(1);
   
  if ($user->can('view', $post)) {
    echo "Current logged in user is allowed to update the Post: {$post->id}";
  } else {
    echo 'Not Authorized.';
  }
}

首先,我们加载当前登录的用户,这为我们提供了 User 模型的对象。接下来,我们使用 Post 模型加载示例帖子。

接下来,我们使用 User 模型的 can 方法来授权 Post 模型的 view 操作。 can 方法的第一个参数是您要授权的操作名称,第二个参数是您要授权的模型对象。

这是如何使用 User 模型通过策略授权操作的演示。或者,如果您在控制器中授权某个操作,则也可以使用控制器助手。

…
$this->authorize('view', $post);
…

如您所见,如果您使用控制器助手,则无需加载 User 模型。

如何通过中间件使用策略

或者,Laravel 还允许您使用中间件授权操作。让我们快速查看以下代码片段,了解如何使用中间件来授权模型操作。

Route::put('/post/{post}', function (Post $post) {
    // Currently logged-in user is allowed to update this post.... 
})->middleware('can:update,post');

在上面的示例中,它将使用 can 中间件。我们传递两个参数:第一个参数是我们想要授权的操作,第二个参数是路由参数。根据隐式模型绑定的规则,第二个参数会自动转换为 Post 模型对象,并作为第二个参数传递。如果当前登录的用户无权执行 update 操作,Laravel 将返回 403 状态代码错误。

如何将策略与刀片模板结合使用

如果您希望在登录用户被授权执行特定操作时显示代码片段,您还可以在刀片模板中使用策略。让我们快速看看它是如何工作的。

@can('delete', $post)
    <!-- Display delete link here... -->
@endcan

在上述情况下,它只会向有权对 Post 模型执行删除操作的用户显示删除链接。

这就是您可以使用的策略概念,在授权模型或资源时它非常方便,因为它允许您将授权逻辑分组在一个地方。

只需确保您不会将门和策略一起用于模型的相同操作,否则会产生问题。这就是我今天的内容,今天就到此为止!

结论

今天,Laravel 授权占据了我文章的中心位置。在文章的开头,我介绍了 Laravel 授权、网关和策略的主要要素。

接下来,我们创建了自定义门和策略,以了解它在现实世界中的工作原理。我希望您喜欢这篇文章,并在 Laravel 环境中学到了一些有用的东西。

对于刚刚开始使用 Laravel 或希望通过扩展来扩展您的知识、网站或应用程序的人,我们在 Envato Market 上提供了多种可供您学习的内容。

위 내용은 Laravel의 게이트와 전략의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.