사용자 인증
ㅋㅋ +
사용자 권한 부여
소개
사용자 인증 서비스를 즉시 제공하는 것 외에도 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.image
和 posts.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(); // } }
use Illuminate\Support\Facades\Gate;
Gate::guessPolicyNamesUsing(function ($modelClass) {
// return policy class name...
});
기본적으로 view
, create
, update
및 삭제
메소드. 배열을 resource
메소드의 세 번째 매개변수로 전달합니다. 기본 메서드를 재정의하거나 추가할 수 있습니다. 배열의 키는 기능의 이름을 정의하고, 값은 메소드의 이름을 정의합니다. 예를 들어, 다음 코드는 posts.image
및 posts.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
方法注册自定义回调。通常,应该从应用程序的 AuthServiceProvider
的 boot
方法调用此方法:
<?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의 서비스를 통과합니다. 구문 분석을 위해 컨테이너를 사용하면 정책 생성자에서 필요한 종속성을 유형 힌트하고 자동으로 주입할 수 있습니다.
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
메서드를 사용하여 사용자 정의 콜백을 등록할 수 있습니다. 일반적으로 이 메소드는 애플리케이션 AuthServiceProvider
의 boot
메소드에서 호출되어야 합니다. 🎜@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
에서 명시적으로 매핑된 모든 정책은 자동 검색 정책보다 우선합니다. 🎜🎜🎜🎜🎜🎜🎜🎜🎜작문 전략🎜🎜🎜🎜🎜🎜🎜전략 방법
인증 정책이 등록되면 인증 후 각 작업에 대한 방법을 추가할 수 있습니다. 예를 들어,
PostPolicy
에update
메소드를 정의합니다. 이 메소드는 지정된사용자
가 지정된게시물
예.PostPolicy
中定义一个update
方法,它会判断指定的User
是否可以更新指定的Post
实例。
update
方法接收User
和Post
实例作为参数,并且应该返回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
选项,它会包含进去view
,create
,update
和delete
动作方法。不包含模型方法
一些策略方法只接收当前认证通过的用户作为参数,而不用传入与授权相关的模型实例。最常见的应用场景就是授权
create
动作。比如,如果你正在创建一篇博客,你可能希望先检查一下当前用户是否有权限创建它。当定义一个不需要传入模型实例的策略方法时,比如
rrreeecreate
方法,它就是不接收模型实例作为参数。你应该定义这个方法只接收授权过的用户作为参数。访客用户
默认情况下,如果传入的 HTTP 请求不是经过身份验证的用户发起的,那么所有的 gates 和策略都会自动返回
false
。 然而,你可以允许这些授权检查通过声明一个『可选的』类型提示或为用户参数定义提供null
update
메소드는User
및Post
인스턴스를 매개변수로 받고true
또는false를 반환해야 합니다. code>는 사용자가 지정된
게시물
을 업데이트할 권한이 있는지 여부를 나타냅니다. 따라서 이 예에서는 사용자의id
가 게시물의user_id
와 일치하는지 확인해야 합니다.{tip} Artisan 콘솔에서 전략을 생성할 때--model
옵션을 사용하면view
,create에 포함됩니다.
,update
및delete
작업 메서드. 🎜🎜🎜🎜모델 메서드를 포함하지 않습니다. 🎜🎜일부 정책 메서드는 현재 인증 인증 관련 모델 인스턴스를 전달하는 대신 사용자를 매개변수로 전달합니다. 가장 일반적인 애플리케이션 시나리오는create
작업을 승인하는 것입니다. 예를 들어, 블로그를 생성하는 경우 현재 사용자에게 블로그 생성 권한이 있는지 먼저 확인해야 할 수 있습니다. 🎜🎜create
메서드와 같이 모델 인스턴스 전달이 필요하지 않은 전략 메서드를 정의하는 경우 모델 인스턴스를 매개 변수로 받지 않습니다. 승인된 사용자만 매개변수로 허용하도록 이 메소드를 정의해야 합니다. 🎜rrreee🎜🎜🎜🎜🎜Guest users🎜🎜기본적으로 들어오는 HTTP 요청이 인증되지 않은 경우 사용자라면 모든 게이트와 정책이 자동으로false
를 반환합니다. 그러나 "선택적" 유형 힌트를 선언하거나 사용자 매개변수 정의에null
기본값을 제공하여 이러한 인증 확인이 게이트 및 정책에 전달되도록 허용할 수 있습니다. 🎜rrreee🎜🎜🎜 🎜🎜🎜정책 필터
특정 사용자의 경우 지정된 정책을 통해 모든 작업을 승인할 수 있습니다. 이를 달성하려면 정책에서
rrreeebefore
메서드를 정의하세요.before
메서드는 정책의 다른 모든 메서드보다 먼저 실행되므로 지정된 정책 메서드 이외의 작업에 판단을 수행하도록 권한을 부여하는 방법을 제공합니다. 이 기능에 대한 가장 일반적인 시나리오는 승인된 애플리케이션의 관리자가 모든 작업에 액세스할 수 있다는 것입니다:before
方法。before
方法会在策略中其它所有方法之前执行,这样提供了一种方式来授权动作而不是指定的策略方法来执行判断。这个功能最常见的场景是授权应用的管理员可以访问所有动作:如果你想拒绝某个用户所有的授权,你应当在
before
方法中返回false
。如果返回值是null
,那么授权会在这个策略中失败。{note} 策略类的
before
方法不会被调用,如果该类不包含与被检查的功能名称相符的方法。使用策略授权动作
通过用户模型
Laravel 内置的
rrreeeUser
模型包含两个有用的方法来授权动作:can
和cant
。这个can
方法需要指定授权的动作以及相关的模型。例如,判断是否授权一个用户更新指定的Post
模型:如果指定模型的 「策略已被注册 」,
can
方法会自动调用合适的策略并返回一个 boolean 值。如果没有策略注册到这个模型,can
方法会尝试调用和指定动作名称相匹配的基于闭包的 Gate。不需要指定模型的动作
记住,一些动作,比如
rrreeecreate
并不需要指定模型实例。在这种情况下,可传递一个类名给can
方法。这个类名将被用于判定使用哪种策略授权动作:通过中间件
Laravel 包含一个可以在请求到达路由或者控制器之前就进行动作授权的中间件。默认情况下,
rrreeeIlluminateAuthMiddlewareAuthorize
中间件被指定到你的AppHttpKernel
类中的can
键上。让我们用一个授权用户更新博客的例子来讲解一下can
这个中间件的使用:在这个例子中,我们传给了
사용자에 대한 모든 승인을 거부하려면can
中间件两个参数。第一个参数是需要授权的动作名称,第二个参数是我们希望传递给策略方法的路由参数。在这种情况下,我们使用了「 隐式路由绑定」,一个Post
模型会被传递给策略方法。如果用户不被授权访问指定的动作,这个中间件将会生成带有403
rrreeebefore<에서
false<를 반환해야 합니다. /코드> 메소드 /코드> . 반환 값이
null
이면 이 정책에서 승인이 실패합니다.{note} 클래스에 검사 중인 함수 이름의 메서드가 없으면 전략 클래스의before
메서드가 호출되지 않습니다. 🎜🎜🎜🎜정책 승인 작업 사용🎜🎜
🎜🎜사용자 모델별🎜🎜Laravel 내장 <코드 > 사용자 모델에는 작업을 승인하는 두 가지 유용한 방법인can
및cant
가 포함되어 있습니다. 이can
메소드는 승인된 작업 및 관련 모델을 지정해야 합니다. 예를 들어, 사용자에게 지정된게시물
모델을 업데이트할 권한이 있는지 확인하려면: 🎜rrreee🎜지정된 모델의 "정책이 등록되었습니다", < code>can 메소드는 자동으로 적절한 전략을 호출하고 부울 값을 반환합니다. 이 모델에 등록된 전략이 없으면can
메서드는 지정된 작업 이름과 일치하는 클로저 기반 Gate를 호출하려고 시도합니다. 🎜🎜모델 작업을 지정할 필요가 없습니다.
🎜create
와 같은 일부 작업은 지정할 필요가 없습니다. 모델 인스턴스를 지정해야 합니다. 이 경우can
메서드에 클래스 이름을 전달하세요. 이 클래스 이름은 사용할 정책 승인 작업을 결정하는 데 사용됩니다. 🎜rrreee🎜🎜🎜🎜 Pass Middleware🎜🎜Laravel에는 요청이 경로나 컨트롤러에 도달하기 전에 작업을 승인할 수 있는 미들웨어가 포함되어 있습니다. 기본적으로IlluminateAuthMiddlewareAuthorize
미들웨어는AppHttpKernel
클래스의can
키에 할당됩니다. 블로그를 업데이트하는 승인된 사용자의 예를 사용하여can
미들웨어의 사용을 설명하겠습니다. 🎜rrreee🎜이 예에서는can
미들웨어 두 매개변수를 전달했습니다. 첫 번째 매개변수는 승인이 필요한 작업의 이름이고, 두 번째 매개변수는 정책 메서드에 전달하려는 라우팅 매개변수입니다. 이 경우에는 "암시적 경로 바인딩"을 사용하고 있으며Post
모델이 전략 메서드에 전달됩니다. 사용자가 지정된 작업에 액세스할 권한이 없는 경우 이 미들웨어는403
상태 코드와 함께 HTTP 응답을 생성합니다. 🎜🎜🎜모델 작업을 지정할 필요가 없습니다
마찬가지로
rrreeecreate
와 같은 일부 작업에는 모델 인스턴스가 필요하지 않을 수 있습니다. 이 경우 미들웨어에 클래스 이름을 전달할 수 있습니다. 이 작업을 승인할 때 사용할 전략을 결정하는 데 이 클래스 이름이 사용됩니다:create
这样的动作可能不需要模型实例。在这种情况下,你可以传一个类名给中间件。当授权这个动作时,这个类名将被用来判断使用哪个策略:通过控制器辅助函数
除了在
rrreeeUser
模型中提供辅助方法以外,Laravel 也为继承AppHttpControllersController
这个基类的控制器提供了一个有用的authorize
方法。就像can
方法一样,这个方法需要接收你想授权的动作和相关的模型作为参数。如果这个动作没有被授权,authorize
方法会抛出一个IlluminateAuthAccessAuthorizationException
的异常,然后 Laravel 默认的异常处理器会将这个异常转化成带有403
状态码的 HTTP 响应。不需要指定模型的动作
和之前讨论的一样,一些动作,比如
rrreeecreate
并不需要指定模型实例的动作。在这种情况下,你可以传递一个类名给authorize
方法。当授权这个动作时,这个类名将被用来判断使用哪个策略:授权资源控制器
如果你使用的是 资源控制器,那么你就可以在控制器构造方法里使用
authorizeResource
方法。该方法会把合适can
中间件附加到资源控制器相应的方法中。rrreee
authorizeResource
方法接收模板类名作为第一个参数,包含模型 ID 的路由 / 请求参数的名称作为其第二个参数:{提示} 你可以使用带有
--model
选项的make:policy
命令去快速生成基于给定模型的策略类::php artisan make:policy PostPolicy --model=Post
。通过 Blade 模板
当编写 Blade 模板时,你可能希望页面的指定部分只展示给授权访问指定动作的用户。比如,你可能希望只展示更新的表单给有权更新博客的用户。在这样情况下,你可以使用
rrreee@can
和@cannot
等一系列指令:这些指令是编写
@if
和@unless
语句的捷径。@can
和@cannot
rrreee컨트롤러 보조 기능을 통해
🎜User
모델에서 보조 메서드를 제공하는 것 외에도 Laravel은AppHttpControllersController의 기본 클래스를 상속하는 컨트롤도 제공합니다. code> 작성자는 유용한
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
대부분의 다른 인증 방법과 마찬가지로 해당 작업에 모델 인스턴스가 필요하지 않은 경우 클래스 이름을
rrreee@ can
和@ cannot
지시어에 전달할 수 있습니다: