사용자 인증


ㅋㅋ +
ResourceGates

사용자 권한 부여

소개

사용자 인증 서비스를 즉시 제공하는 것 외에도 Laravel은 사용자 인증 작업을 처리하는 쉬운 방법도 제공합니다. 사용자 인증과 마찬가지로 Laravel의 인증 방법은 게이트와 정책이라는 두 가지 주요 방법으로 간단합니다.

게이트와 전략을 라우팅 및 컨트롤러와 비교할 수 있습니다. Gates는 간단한 폐쇄 기반 인증 방법을 제공하는 반면, 정책은 컨트롤러와 유사하며 특정 모델이나 리소스를 중심으로 논리를 그룹화하여 인증 인증을 구현합니다. 먼저 게이트를 탐색한 다음 전략을 살펴봅니다.

애플리케이션을 구축할 때 게이트만 사용할 것인지 전략만 사용할 것인지 선택할 필요는 없습니다. 대부분의 애플리케이션에는 게이트와 정책이 모두 포함될 것이며 제대로 작동할 것입니다. Gates는 관리자 패널 보기 등 모델과 리소스가 관련되지 않은 곳에서 주로 사용됩니다. 이와 대조적으로 전략은 특정 모델이나 리소스 내에서 사용해야 합니다.

게이트

Writing Gates

Gates는 사용자가 특정 작업을 수행할 수 있는 권한이 있는지 확인하는 데 사용되는 폐쇄 기능이며 일반적인 방법은
AppProvidersAuthServiceProvider에서 Gate를 사용하여 Gates는 항상 사용자 인스턴스를 첫 번째 매개변수로 수신하고 관련 Eloquent 모델과 같은 선택적 매개변수를 수신할 수 있습니다. AppProvidersAuthServiceProvider 中使用 Gate 来定义.  Gates 总是接收一个用户实例作为第一个参数,并且可以接收可选参数,比如相关的 Eloquent 模型:

/**
 * 注册任意用户认证、用户授权服务。
 *
 * @return void
 */
 public function boot(){ 
    $this->registerPolicies();    
    Gate::define('update-post', function ($user, $post) {  
          return $user->id == $post->user_id;  
       });
  }

Gates 也可以使用类似控制器方法 Class@method 风格的回调字符串来定义:

/**
 * 注册任意用户认证、用户授权服务。
 *
 * @return void
 */
 public function boot(){ 
    $this->registerPolicies();    
    Gate::define('update-post', 'App\Policies\PostPolicy@update');
   }

资源 Gates

你还可以使用 resource 方法去一次性的定义多个 Gate 方法:

Gate::resource('posts', 'App\Policies\PostPolicy');

上面的手动定义和以下的 Gate 定义效果是相同的:

Gate::define('posts.view', 'App\Policies\PostPolicy@view');
Gate::define('posts.create', 'App\Policies\PostPolicy@create');
Gate::define('posts.update', 'App\Policies\PostPolicy@update');
Gate::define('posts.delete', 'App\Policies\PostPolicy@delete');

默认情况下将会定义 view, create, update, 和 delete 方法。通过将一个数组作为第三个参数传给  resource 方法。你可以覆盖或者添加到默认的方法中。数组的键定义能力的名称,值定义方法的名称。例如,下面的代码将创建两个新的 Gate 定义 -  posts.imageposts.photo:

Gate::resource('posts', 'PostPolicy', [ 
   'image' => 'updateImage',    
   'photo' => 'updatePhoto',
 ]);

授权动作

使用 gates 来授权动作的时候, 你应该使用 allows 或者 denies 方法。 注意,不需要将当前已认证用户传递给这些方法。 Laravel 会自动处理好已经认证通过的用户,然后传递给 gete 闭包函数:

if (Gate::allows('update-post', $post)) { 
   // 指定当前用户可以进行更新...
  }
if (Gate::denies('update-post', $post)) { 
   // 指定当前用户不能更新...
  }

如果你想判断一个特定的用户是否已经被授权访问某个动作, 你可以使用在  Gate 在 facade 的 forUser 方法:

if (Gate::forUser($user)->allows('update-post', $post)) {
    // 用户可以更新...
  }
if (Gate::forUser($user)->denies('update-post', $post)) {
    // 用户不能更新...
  }

Gate 拦截检查

有时,你可能希望将所有能力授予特定用户。所以你可以在所有其他授权检查之前使用 before 方法来定义运行的回调:

Gate::before(function ($user, $ability) { 
   if ($user->isSuperAdmin()) {   
        return true;  
    }
});

如果 before 回调方法返回的是非 null 的结果,则结果将被视为检查结果。

在每次授权检查后你可以使用 after 方法定义要执行的回调。 但是,你不能从 after 回调方法中修改授权检查的结果:

Gate::after(function ($user, $ability, $result, $arguments) { 
   //
});

before 检查类似,如果 after

php artisan make:policy PostPolicy

Gates는 유사한 컨트롤러 메소드 Class@method 스타일 콜백 문자열을 사용할 수도 있습니다. 정의하려면:
php artisan make:policy PostPolicy --model=Post

리소스 게이트

일회성 가져오기 위해 resource 메소드를 사용할 수도 있습니다. 여러 Gate 메소드 정의:
<?php
    namespace App\Providers;
    use App\Post;use App\Policies\PostPolicy;
    use Illuminate\Support\Facades\Gate;
    use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
    class AuthServiceProvider extends ServiceProvider{  
      /**
     * 应用的策略映射。
     *
     * @var array
     */ 
     protected $policies = [  
          Post::class => PostPolicy::class,  
       ];   
     /**
     * 注册任意应用认证、应用授权服务
     *
     * @return void
     */ 
   public function boot()   
    {     
       $this->registerPolicies();   
            //   
     }
   }
위의 수동 정의는 다음 Gate 정의와 동일한 효과를 갖습니다.

use Illuminate\Support\Facades\Gate;
Gate::guessPolicyNamesUsing(function ($modelClass) {
    // return policy class name...
 });

기본적으로 view, create, update 삭제 메소드. 배열을 resource 메소드의 세 번째 매개변수로 전달합니다. 기본 메서드를 재정의하거나 추가할 수 있습니다. 배열의 키는 기능의 이름을 정의하고, 값은 메소드의 이름을 정의합니다. 예를 들어, 다음 코드는 posts.imageposts.photo라는 두 개의 새로운 Gate 정의를 생성합니다.

<?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;   
     }
 }

승인된 작업🎜🎜게이트를 사용하여 작업을 승인하는 경우 허용 또는 거부를 사용해야 합니다. 코드> 방법. 현재 인증된 사용자를 이러한 메소드에 전달할 필요는 없습니다. Laravel은 인증된 사용자를 자동으로 처리한 다음 이를 gete 클로저 함수에 전달합니다: 🎜
/**
 * 判断用户是否可以创建请求。
 *
 * @param  \App\User  $user
 * @return bool
 */
 public function create(User $user){ 
    //
 }
🎜 특정 사용자가 작업에 액세스할 수 있는 권한이 있는지 확인하려면 Gate forUser 파사드의 메소드: 🎜
<?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;  
     }
  }
🎜🎜🎜
🎜

게이트 차단 확인< /h4>🎜때때로 특정 사용자에게 모든 기능을 부여하고 싶을 수도 있습니다. 따라서 before 메서드를 사용하여 다른 모든 인증 확인 전에 실행되는 콜백을 정의할 수 있습니다. 🎜
public function before($user, $ability){
    if ($user->isSuperAdmin()) { 
       return true; 
     }
 }
🎜 before 콜백 메서드가 null이 아닌 결과를 반환하는 경우 결과는 검사 결과로 간주됩니다. 🎜🎜after 메서드를 사용하여 각 인증 확인 후에 실행될 콜백을 정의할 수 있습니다. 그러나 after 콜백 메서드에서 인증 확인 결과를 수정할 수 없습니다. 🎜
if ($user->can('update', $post)) { 
   //
}
🎜before 확인과 유사합니다. 콜백이 null이 아닌 값을 반환합니다. 결과는 검사 결과로 간주됩니다. 🎜🎜🎜🎜🎜🎜🎜 전략 만들기 🎜🎜🎜🎜🎜🎜🎜

Generate Policies

Strategy는 특정 모델이나 리소스에서 인증 논리를 구성하는 클래스입니다. 예를 들어 애플리케이션이 블로그인 경우 블로그를 생성하거나 업데이트할 때 사용자 작업을 승인하는 Post 모델과 해당 PostPolicy가 있을 수 있습니다. Post 模型和一个对应的 PostPolicy 来授权用户动作。

你可以使用 artisan 命令 artisan command 中的 make:policy artisan command 命令来生成策略。 生成的策略将放置在  app/Policies 目录中。如果在你的应用中不存在这个目录,那么 Laravel 将会为你自动生成:

use App\Post;if ($user->can('create', Post::class)) { 
   // 执行相关策略中的 "create" 方法...
 }

make:policy 命令会生成一个空的策略类。如果你想生成的类包含基本的 「CRUD」策略方法,你可以在执行命令的时候指定  --model 这个选项:

use App\Post;Route::put('/post/{post}', function (Post $post) {
    // 当前用户可以进行更新操作...
})->middleware('can:update,post');

{tip} 所有的策略会通过 Laravel 的  服务容器,来解析,允许你在策略构造器中对任何需要的依赖使用类型提示,并且自动注入。

注册策略

一旦策略存在,它就需要进行注册。新的 Laravel 应用中包含的 AuthServiceProvider 有一个 policies 属性,可以将各种模型对应到它们的策略中。注册一个策略将引导 Laravel 在授权动作访问指定模型的时候使用哪种策略:

Route::post('/post', function () {
    // 当前用户可以进行创建操作...
 })->middleware('can:create,App\Post');

策略自动发现

只要模型和策略遵循标准的 Laravel 命名约定,Laravel 就可以自动发现策略,而不是手动注册模型策略。具体而言,策略必须位于包含模型的目录下的 Policies 目录中。因此,例如模型可以放在 app 目录中,而策略可以放在 app/Policies 目录中。此外,策略名称必须与模型名称匹配,并具有 Policy 后缀。因此,User 模型将对应于 UserPolicy 类。

如果您想提供自己的策略发现逻辑,可以使用 Gate :: guessPolicyNamesUsing 方法注册自定义回调。通常,应该从应用程序的 AuthServiceProviderboot 方法调用此方法:

<?php
     namespace App\Http\Controllers;
     use App\Post;use Illuminate\Http\Request;
     use App\Http\Controllers\Controller;
     class PostController extends Controller{  
       /**
     * 更新指定博客帖子。
     *
     * @param  Request  $request
     * @param  Post  $post
     * @return Response
     * @throws \Illuminate\Auth\Access\AuthorizationException
     */ 
   public function update(Request $request, Post $post)  
     {     
       $this->authorize('update', $post);     
       // 当前用户可以更新博客...   
      }
  }

{note} 在 AuthServiceProvider

artisan command artisan 명령에서 make:policy artisan 명령 명령을 사용하여 정책을 생성할 수 있습니다. 생성된 정책은 app/Policies 디렉터리에 저장됩니다. 이 디렉토리가 애플리케이션에 없으면 Laravel이 자동으로 이를 생성합니다:
/**
 * 创建一个新的博客
 *
 * @param  Request  $request
 * @return Response
 * @throws \Illuminate\Auth\Access\AuthorizationException
 */
 public function create(Request $request){ 
    $this->authorize('create', Post::class);  
    // 当前用户可以新建博客...
  }

make:policy 명령은 빈 정책 클래스를 생성합니다. 생성하려는 클래스에 기본 "CRUD" 전략 메소드가 포함되어 있는 경우 명령을 실행할 때 --model 옵션을 지정할 수 있습니다:

<?php
    namespace App\Http\Controllers;
    use App\Post;use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    class PostController extends Controller{ 
       public function __construct() 
          {       
            $this->authorizeResource(Post::class, 'post');  
           }
     }
{tip} 모든 전략은 Laravel의 서비스를 통과합니다. 구문 분석을 위해 컨테이너를 사용하면 정책 생성자에서 필요한 종속성을 유형 힌트하고 자동으로 주입할 수 있습니다.

정책 등록

정책이 존재하면 등록해야 합니다. 새로운 Laravel 애플리케이션에 포함된 AuthServiceProvider에는 다양한 모델을 해당 정책에 매핑하는 policies 속성이 있습니다. 정책을 등록하면 지정된 모델에 액세스하기 위한 작업을 승인할 때 어떤 정책을 사용할지 Laravel에 지시합니다:
@can('update', $post) 
  <!-- The Current User Can Update The Post -->
@elsecan('create', App\Post::class)  
  <!-- The Current User Can Create New Post -->
@endcan
@cannot('update', $post) 
  <!-- The Current User Can't Update The Post -->
@elsecannot('create', App\Post::class)
  <!-- The Current User Can't Create New Post -->
 @endcannot

정책 자동 검색

🎜As 표준 Laravel 명명 규칙과 전략을 따르면 Laravel은 모델 전략을 수동으로 등록하는 대신 자동으로 전략을 발견할 수 있습니다. 특히 정책은 모델이 포함된 디렉터리 아래의 Policies 디렉터리에 있어야 합니다. 예를 들어 모델은 app 디렉터리에 배치할 수 있고 정책은 app/Policies 디렉터리에 배치할 수 있습니다. 또한 정책 이름은 모델 이름과 일치해야 하며 Policy 접미사가 있어야 합니다. 따라서 User 모델은 UserPolicy 클래스에 해당합니다. 🎜🎜자신만의 정책 검색 로직을 제공하려면 Gate::guessPolicyNamesUsing 메서드를 사용하여 사용자 정의 콜백을 등록할 수 있습니다. 일반적으로 이 메소드는 애플리케이션 AuthServiceProviderboot 메소드에서 호출되어야 합니다. 🎜
@if (Auth::user()->can('update', $post))  
  <!-- The Current User Can Update The Post -->
@endif
@unless (Auth::user()->can('update', $post))   
 <!-- The Current User Can't Update The Post -->
@endunless
🎜{note} AuthServiceProvider에서 명시적으로 매핑된 모든 정책은 자동 검색 정책보다 우선합니다. 🎜🎜🎜🎜🎜🎜🎜🎜🎜작문 전략🎜🎜🎜🎜🎜🎜🎜

전략 방법

인증 정책이 등록되면 인증 후 각 작업에 대한 방법을 추가할 수 있습니다. 예를 들어, PostPolicyupdate 메소드를 정의합니다. 이 메소드는 지정된 사용자가 지정된 게시물 예. PostPolicy 中定义一个 update 方法,它会判断指定的 User 是否可以更新指定的 Post 实例。

update 方法接收 UserPost 实例作为参数,并且应该返回 true 或者 false 来表明用户是否被授权更新指定的 Post 。所以在这个例子中,我们需要判断用户的 id 是否和 post 中的 user_id 匹配。

@can('create', App\Post::class) 
   <!-- The Current User Can Create Posts -->
@endcan
@cannot('create', App\Post::class)   
      <!-- The Current User Can't Create Posts -->
@endcannot

你可以继续为这个授权策略定义额外的方法。比如,你可以定义 view 或者 delete 方法来授权 Post 的多种行为,还可以为自定义的策略方法起一个你自己喜欢的名字。

{tip} 如果在 Artisan 控制台生成策略时,使用 --model 选项,它会包含进去 viewcreateupdatedelete 动作方法。

不包含模型方法

一些策略方法只接收当前认证通过的用户作为参数,而不用传入与授权相关的模型实例。最常见的应用场景就是授权 create 动作。比如,如果你正在创建一篇博客,你可能希望先检查一下当前用户是否有权限创建它。

当定义一个不需要传入模型实例的策略方法时,比如 create 方法,它就是不接收模型实例作为参数。你应该定义这个方法只接收授权过的用户作为参数。

rrreee

访客用户

默认情况下,如果传入的 HTTP 请求不是经过身份验证的用户发起的,那么所有的 gates 和策略都会自动返回 false。 然而,你可以允许这些授权检查通过声明一个『可选的』类型提示或为用户参数定义提供 null

update 메소드는 UserPost 인스턴스를 매개변수로 받고 true 또는 false는 사용자가 지정된 게시물을 업데이트할 권한이 있는지 여부를 나타냅니다. 따라서 이 예에서는 사용자의 id가 게시물의 user_id와 일치하는지 확인해야 합니다.

rrreee이 승인 정책에 대한 추가 방법을 계속 정의할 수 있습니다. 예를 들어, 게시의 다양한 동작을 승인하기 위해 보기 또는 삭제 메소드를 정의할 수 있으며 자신만의 맞춤 전략 메소드를 만들 수도 있습니다. 이름.

{tip} Artisan 콘솔에서 전략을 생성할 때 --model 옵션을 사용하면 view, create에 포함됩니다. , updatedelete 작업 메서드.
🎜🎜
🎜🎜모델 메서드를 포함하지 않습니다. 🎜🎜일부 정책 메서드는 현재 인증 인증 관련 모델 인스턴스를 전달하는 대신 사용자를 매개변수로 전달합니다. 가장 일반적인 애플리케이션 시나리오는 create 작업을 승인하는 것입니다. 예를 들어, 블로그를 생성하는 경우 현재 사용자에게 블로그 생성 권한이 있는지 먼저 확인해야 할 수 있습니다. 🎜🎜create 메서드와 같이 모델 인스턴스 전달이 필요하지 않은 전략 메서드를 정의하는 경우 모델 인스턴스를 매개 변수로 받지 않습니다. 승인된 사용자만 매개변수로 허용하도록 이 메소드를 정의해야 합니다. 🎜rrreee🎜🎜🎜
🎜🎜Guest users🎜🎜기본적으로 들어오는 HTTP 요청이 인증되지 않은 경우 사용자라면 모든 게이트와 정책이 자동으로 false를 반환합니다. 그러나 "선택적" 유형 힌트를 선언하거나 사용자 매개변수 정의에 null 기본값을 제공하여 이러한 인증 확인이 게이트 및 정책에 전달되도록 허용할 수 있습니다. 🎜rrreee🎜🎜🎜 🎜🎜🎜

정책 필터

특정 사용자의 경우 지정된 정책을 통해 모든 작업을 승인할 수 있습니다. 이를 달성하려면 정책에서 before 메서드를 정의하세요. before 메서드는 정책의 다른 모든 메서드보다 먼저 실행되므로 지정된 정책 메서드 이외의 작업에 판단을 수행하도록 권한을 부여하는 방법을 제공합니다. 이 기능에 대한 가장 일반적인 시나리오는 승인된 애플리케이션의 관리자가 모든 작업에 액세스할 수 있다는 것입니다: before 方法。 before 方法会在策略中其它所有方法之前执行,这样提供了一种方式来授权动作而不是指定的策略方法来执行判断。这个功能最常见的场景是授权应用的管理员可以访问所有动作:

rrreee

如果你想拒绝某个用户所有的授权,你应当在 before 方法中返回 false 。如果返回值是 null ,那么授权会在这个策略中失败。

{note} 策略类的 before 方法不会被调用,如果该类不包含与被检查的功能名称相符的方法。

使用策略授权动作

通过用户模型

Laravel 内置的 User 模型包含两个有用的方法来授权动作: cancant。这个 can 方法需要指定授权的动作以及相关的模型。例如,判断是否授权一个用户更新指定的 Post 模型:

rrreee

如果指定模型的 「策略已被注册 」, can 方法会自动调用合适的策略并返回一个 boolean 值。如果没有策略注册到这个模型,can 方法会尝试调用和指定动作名称相匹配的基于闭包的 Gate。

不需要指定模型的动作

记住,一些动作,比如 create 并不需要指定模型实例。在这种情况下,可传递一个类名给 can 方法。这个类名将被用于判定使用哪种策略授权动作:

rrreee

通过中间件

Laravel 包含一个可以在请求到达路由或者控制器之前就进行动作授权的中间件。默认情况下, IlluminateAuthMiddlewareAuthorize 中间件被指定到你的 AppHttpKernel 类中的 can 键上。让我们用一个授权用户更新博客的例子来讲解一下 can 这个中间件的使用:

rrreee

在这个例子中,我们传给了 can 中间件两个参数。第一个参数是需要授权的动作名称,第二个参数是我们希望传递给策略方法的路由参数。在这种情况下,我们使用了「 隐式路由绑定」,一个 Post 模型会被传递给策略方法。如果用户不被授权访问指定的动作,这个中间件将会生成带有 403rrreee

사용자에 대한 모든 승인을 거부하려면 before<에서 false<를 반환해야 합니다. /코드> 메소드 /코드> . 반환 값이 null 이면 이 정책에서 승인이 실패합니다.
{note} 클래스에 검사 중인 함수 이름의 메서드가 없으면 전략 클래스의 before 메서드가 호출되지 않습니다. 🎜
🎜🎜
🎜

정책 승인 작업 사용🎜🎜
🎜🎜사용자 모델별🎜🎜Laravel 내장 <코드 > 사용자 모델에는 작업을 승인하는 두 가지 유용한 방법인 cancant가 포함되어 있습니다. 이 can 메소드는 승인된 작업 및 관련 모델을 지정해야 합니다. 예를 들어, 사용자에게 지정된 게시물 모델을 업데이트할 권한이 있는지 확인하려면: 🎜rrreee🎜지정된 모델의 "정책이 등록되었습니다", < code>can 메소드는 자동으로 적절한 전략을 호출하고 부울 값을 반환합니다. 이 모델에 등록된 전략이 없으면 can 메서드는 지정된 작업 이름과 일치하는 클로저 기반 Gate를 호출하려고 시도합니다. 🎜
🎜

모델 작업을 지정할 필요가 없습니다.

🎜 create와 같은 일부 작업은 지정할 필요가 없습니다. 모델 인스턴스를 지정해야 합니다. 이 경우 can 메서드에 클래스 이름을 전달하세요. 이 클래스 이름은 사용할 정책 승인 작업을 결정하는 데 사용됩니다. 🎜rrreee🎜🎜
🎜🎜 Pass Middleware🎜🎜Laravel에는 요청이 경로나 컨트롤러에 도달하기 전에 작업을 승인할 수 있는 미들웨어가 포함되어 있습니다. 기본적으로 IlluminateAuthMiddlewareAuthorize 미들웨어는 AppHttpKernel 클래스의 can 키에 할당됩니다. 블로그를 업데이트하는 승인된 사용자의 예를 사용하여 can 미들웨어의 사용을 설명하겠습니다. 🎜rrreee🎜이 예에서는 can 미들웨어 두 매개변수를 전달했습니다. 첫 번째 매개변수는 승인이 필요한 작업의 이름이고, 두 번째 매개변수는 정책 메서드에 전달하려는 라우팅 매개변수입니다. 이 경우에는 "암시적 경로 바인딩"을 사용하고 있으며 Post 모델이 전략 메서드에 전달됩니다. 사용자가 지정된 작업에 액세스할 권한이 없는 경우 이 미들웨어는 403 상태 코드와 함께 HTTP 응답을 생성합니다. 🎜🎜🎜

모델 작업을 지정할 필요가 없습니다

마찬가지로 create와 같은 일부 작업에는 모델 인스턴스가 필요하지 않을 수 있습니다. 이 경우 미들웨어에 클래스 이름을 전달할 수 있습니다. 이 작업을 승인할 때 사용할 전략을 결정하는 데 이 클래스 이름이 사용됩니다: create 这样的动作可能不需要模型实例。在这种情况下,你可以传一个类名给中间件。当授权这个动作时,这个类名将被用来判断使用哪个策略:

rrreee

通过控制器辅助函数

除了在 User 模型中提供辅助方法以外,Laravel 也为继承  AppHttpControllersController 这个基类的控制器提供了一个有用的 authorize 方法。就像 can 方法一样,这个方法需要接收你想授权的动作和相关的模型作为参数。如果这个动作没有被授权, authorize 方法会抛出一个 IlluminateAuthAccessAuthorizationException 的异常,然后 Laravel 默认的异常处理器会将这个异常转化成带有  403 状态码的 HTTP 响应。

rrreee

不需要指定模型的动作

和之前讨论的一样,一些动作,比如 create 并不需要指定模型实例的动作。在这种情况下,你可以传递一个类名给 authorize 方法。当授权这个动作时,这个类名将被用来判断使用哪个策略:

rrreee

授权资源控制器

如果你使用的是 资源控制器,那么你就可以在控制器构造方法里使用 authorizeResource 方法。该方法会把合适 can 中间件附加到资源控制器相应的方法中。

authorizeResource 方法接收模板类名作为第一个参数,包含模型 ID 的路由 / 请求参数的名称作为其第二个参数:

rrreee

{提示} 你可以使用带有 --model 选项的 make:policy 命令去快速生成基于给定模型的策略类::php artisan make:policy PostPolicy --model=Post

通过 Blade 模板

当编写 Blade 模板时,你可能希望页面的指定部分只展示给授权访问指定动作的用户。比如,你可能希望只展示更新的表单给有权更新博客的用户。在这样情况下,你可以使用 @can@cannot 等一系列指令:

rrreee

这些指令是编写 @if@unless 语句的捷径。 @can@cannotrrreee

컨트롤러 보조 기능을 통해

🎜 User 모델에서 보조 메서드를 제공하는 것 외에도 Laravel은 AppHttpControllersController 작성자는 유용한 authorize 메소드를 제공합니다. can 메소드와 마찬가지로 이 메소드는 승인하려는 작업과 관련 모델을 매개변수로 사용합니다. 이 작업이 승인되지 않으면 authorize 메소드는 IlluminateAuthAccessAuthorizationException 예외를 발생시키고 Laravel의 기본 예외 핸들러는 이 예외를 403 <을 사용하여 예외로 변환합니다. /code> HTTP 응답의 상태 코드입니다. 🎜rrreee
🎜🎜모델 작업을 지정할 필요가 없습니다🎜🎜앞서 설명한 것처럼 create와 같은 일부 작업은 모델 작업을 지정할 필요가 없습니다. 모델 인스턴스 작업. 이 경우 authorize 메소드에 클래스 이름을 전달할 수 있습니다. 이 작업을 승인할 때 이 클래스 이름은 사용할 전략을 결정하는 데 사용됩니다: 🎜rrreee
🎜🎜Authorize Resource Controller🎜🎜리소스 컨트롤러를 사용하는 경우, 그런 다음 컨트롤러 생성자에서 authorizeResource 메서드를 사용할 수 있습니다. 이 메소드는 적절한 can 미들웨어를 리소스 컨트롤러의 해당 메소드에 연결합니다. 🎜🎜authorizeResource 메소드는 템플릿 클래스 이름을 첫 번째 매개변수로 받고 모델 ID를 포함하는 경로/요청 매개변수의 이름을 두 번째 매개변수로 받습니다. 🎜rrreee
🎜{Tip} 다음과 같이 할 수 있습니다. 주어진 모델을 기반으로 정책 클래스를 빠르게 생성하려면 --model 옵션과 함께 make:policy 명령을 사용하십시오: php artisan make:policy PostPolicy -- 모델= 포스트. 🎜
🎜🎜
🎜

블레이드 템플릿을 통해

🎜 블레이드 템플릿을 작성할 때 특정 작업에 액세스할 권한이 있는 사용자에게만 페이지의 특정 부분이 표시되도록 할 수 있습니다. 예를 들어 블로그 업데이트 권한이 있는 사용자에게만 업데이트된 양식을 표시할 수 있습니다. 이 경우 @can@cannot과 같은 일련의 명령을 사용할 수 있습니다. 🎜rrreee🎜이 명령은 @if에 의해 작성되었습니다. 및 < code>@unless
문의 단축키입니다. @can@cannot 문은 각각 다음 문으로 변환됩니다. 🎜rrreee🎜🎜

Model-free actions

대부분의 다른 인증 방법과 마찬가지로 해당 작업에 모델 인스턴스가 필요하지 않은 경우 클래스 이름을 @ can@ cannot 지시어에 전달할 수 있습니다:

rrreee
이 기사는 LearnKu.com 웹사이트에 처음 게재되었습니다.