Laravel 인가 편집하기

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
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 정책 클래스가 수동으로 연결됩니다.


==정책 작성==
==정책 작성==

제타위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 제타위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 편집 도움말 (새 창에서 열림)