최신판 |
당신의 편집 |
208번째 줄: |
208번째 줄: |
|
| |
|
| ===게이트 체크 가로채기=== | | ===게이트 체크 가로채기=== |
| 때로는 특정 사용자에게 모든 권한을 부여하고자 할 때가 있습니다. <code>before</code> 메소드를 사용하여 다른 모든 권한 검사 전에 실행되는 클로저를 정의할 수 있습니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| use App\Models\User;
| |
| use Illuminate\Support\Facades\Gate;
| |
|
| |
| Gate::before(function (User $user, string $ability) {
| |
| if ($user->isAdministrator()) {
| |
| return true;
| |
| }
| |
| });
| |
| </syntaxhighlight>
| |
|
| |
| <code>before</code> 클로저가 null이 아닌 결과를 반환하면, 그 결과가 권한 검사 결과로 간주됩니다.
| |
|
| |
| <code>after</code> 메소드를 사용하여 다른 모든 권한 검사 후에 실행되는 클로저를 정의할 수도 있습니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| use App\Models\User;
| |
|
| |
| Gate::after(function (User $user, string $ability, bool|null $result, mixed $arguments) {
| |
| if ($user->isAdministrator()) {
| |
| return true;
| |
| }
| |
| });
| |
| </syntaxhighlight>
| |
|
| |
| <code>before</code> 메소드와 마찬가지로, <code>after</code> 클로저가 null이 아닌 결과를 반환하면, 그 결과가 권한 검사 결과로 간주됩니다.
| |
|
| |
| ===인라인 인가=== | | ===인라인 인가=== |
| 때로는, 특정 작업에 해당하는 전용 게이트를 작성하지 않고 현재 인증된 사용자가 주어진 작업을 수행할 권한이 있는지 확인하고 싶을 때가 있습니다. Laravel은 <code>Gate::allowIf</code>와 <code>Gate::denyIf</code> 메소드를 통해 이러한 유형의 "인라인" 인가를 수행할 수 있습니다. 인라인 인가는 정의된 [[#게이트 체크 가로채기|"before" 또는 "after" 인가 훅]]을 실행하지 않습니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| use App\Models\User;
| |
| use Illuminate\Support\Facades\Gate;
| |
|
| |
| Gate::allowIf(fn (User $user) => $user->isAdministrator());
| |
|
| |
| Gate::denyIf(fn (User $user) => $user->banned());
| |
| </syntaxhighlight>
| |
|
| |
| 작업이 인가되지 않았거나 현재 인증된 사용자가 없는 경우, Laravel은 자동으로 <code>Illuminate\Auth\Access\AuthorizationException</code> 예외를 던집니다. <code>AuthorizationException</code> 인스턴스는 Laravel의 예외 처리기에 의해 자동으로 403 HTTP 응답으로 변환됩니다.
| |
|
| |
| ==정책 생성== | | ==정책 생성== |
| ===정책 생성하기=== | | ===정책 생성하기=== |
| 정책은 특정 모델이나 리소스와 관련된 인가 로직을 구성하는 클래스입니다. 예를 들어, 애플리케이션이 블로그라면, <code>App\Models\Post</code> 모델과 해당 모델에 대한 사용자 액션(예: 게시물 작성 또는 업데이트)을 승인하는 <code>App\Policies\PostPolicy</code>가 있을 수 있습니다.
| |
|
| |
| <code>make:policy</code> Artisan 명령어를 사용하여 정책을 생성할 수 있습니다. 생성된 정책은 <code>app/Policies</code> 디렉토리에 배치됩니다. 이 디렉토리가 없으면 Laravel이 생성합니다:
| |
|
| |
| <syntaxhighlight lang='bash'>
| |
| php artisan make:policy PostPolicy
| |
| </syntaxhighlight>
| |
|
| |
| <code>make:policy</code> 명령어는 빈 정책 클래스를 생성합니다. 리소스 보기, 작성, 업데이트, 삭제와 관련된 예제 정책 메소드가 포함된 클래스를 생성하려면 명령을 실행할 때 <code>--model</code> 옵션을 제공할 수 있습니다:
| |
|
| |
| <syntaxhighlight lang='bash'>
| |
| php artisan make:policy PostPolicy --model=Post
| |
| </syntaxhighlight>
| |
|
| |
| ===정책 등록하기=== | | ===정책 등록하기=== |
| ;정책 발견
| |
| 기본적으로, Laravel은 모델과 정책이 표준 Laravel 명명 규칙을 따르는 한 자동으로 정책을 발견합니다. 구체적으로 정책은, 모델을 포함하는 디렉토리 또는 그 상위 디렉토리에 있는 <code>Policies</code> 디렉토리에 있어야 합니다. 예를 들어, 모델이 <code>app/Models</code> 디렉토리에 배치된 경우, 정책은 <code>app/Policies</code> 디렉토리에 배치될 수 있습니다. 이러한 상황에서 Laravel은 먼저 <code>app/Models/Policies</code>를 확인한 다음 <code>app/Policies</code>를 확인합니다. 또한, 정책 이름은 모델 이름과 일치하고 <code>Policy</code> 접미어를 가져야 합니다. 따라서 <code>User</code> 모델은 <code>UserPolicy</code> 정책 클래스와 대응됩니다.
| |
|
| |
| 자신만의 정책 발견 로직을 정의하고 싶다면 <code>Gate::guessPolicyNamesUsing</code> 메소드를 사용하여 커스텀 정책 발견 콜백을 등록할 수 있습니다. 일반적으로 이 메소드는 애플리케이션의 <code>AppServiceProvider</code>의 <code>boot</code> 메소드에서 호출되어야 합니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| use Illuminate\Support\Facades\Gate;
| |
|
| |
| Gate::guessPolicyNamesUsing(function (string $modelClass) {
| |
| // 주어진 모델에 대한 정책 클래스 이름을 반환합니다...
| |
| });
| |
| </syntaxhighlight>
| |
|
| |
| ;정책 수동 등록
| |
| <code>Gate</code> 파사드를 사용하여 애플리케이션의 <code>AppServiceProvider</code>의 <code>boot</code> 메소드 내에서 정책과 해당 모델을 수동으로 등록할 수 있습니다:
| |
|
| |
| <syntaxhighlight lang='php'>
| |
| use App\Models\Order;
| |
| use App\Policies\OrderPolicy;
| |
| use Illuminate\Support\Facades\Gate;
| |
|
| |
| /**
| |
| * 애플리케이션 서비스를 부트스트랩합니다.
| |
| */
| |
| public function boot(): void
| |
| {
| |
| Gate::policy(Order::class, OrderPolicy::class);
| |
| }
| |
| </syntaxhighlight>
| |
| 이렇게 하면 Order 모델과 OrderPolicy 정책 클래스가 수동으로 연결됩니다.
| |
|
| |
|
| ==정책 작성== | | ==정책 작성== |