Laravel에서 자동 할당 및 권한 재활용을 구현하는 방법

WBOY
풀어 주다: 2023-11-04 11:03:29
원래의
755명이 탐색했습니다.

Laravel에서 자동 할당 및 권한 재활용을 구현하는 방법

Laravel은 권한 관리와 같은 일반적인 문제를 구현하는 편리한 도구를 제공하는 널리 사용되는 PHP 프레임워크입니다. 많은 애플리케이션에서는 사용자가 액세스해야 하는 항목에만 액세스할 수 있도록 하기 위해 사용자 권한을 세밀하게 제어해야 합니다. 이번 글에서는 Laravel에서 권한을 자동으로 할당하고 취소하는 방법을 살펴보겠습니다. 동시에 구체적인 코드 예제도 제공할 예정입니다.

1. Laravel의 다형성 연관을 사용하여 권한 자동 할당 및 재활용 실현

Laravel의 Eloquent ORM은 다형성 연관 기능을 제공합니다. 이는 여러 다른 모델을 동일한 데이터 세트와 연결할 수 있음을 의미합니다. 이는 권한의 자동 할당 및 재활용에 매우 유용합니다.

예를 들어, 애플리케이션의 "기사"와 "댓글"에 대한 권한을 제어하고 사용자에게 역할을 할당해야 한다고 가정해 보겠습니다. 다음 네 가지 모델을 만들 수 있습니다.

  • User(사용자)
  • Article(기사)
  • Comment(댓글)
  • Role(역할)

그런 다음 다형성 연관 기능을 사용하여 세 모델을 결합할 수 있습니다. 역할 연관:

class User extends Model
{
    public function roles()
    {
        return $this->morphToMany(Role::class, 'model', 'model_has_roles');
    }
}

class Article extends Model
{
    public function roles()
    {
        return $this->morphToMany(Role::class, 'model', 'model_has_roles');
    }
}

class Comment extends Model
{
    public function roles()
    {
        return $this->morphToMany(Role::class, 'model', 'model_has_roles');
    }
}
로그인 후 복사

이 예제에서는 Laravel의 다형성 연관 기능을 사용하여 세 가지 모델과 해당 레코드에 대한 역할 관계를 정의할 수 있습니다. 다음 단계는 이러한 관계를 유지하기 위한 중간 테이블을 만드는 것입니다.

class CreateModelHasRolesTable extends Migration
{
    public function up()
    {
        Schema::create('model_has_roles', function (Blueprint $table) {
            $table->unsignedBigInteger('role_id');
            $table->unsignedBigInteger('model_id');
            $table->string('model_type');
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->primary(['role_id', 'model_id', 'model_type']);
        });
    }
}
로그인 후 복사

이제 위 모델을 해당 역할과 연결할 수 있습니다. 예를 들어, 게시물 작성자에게 "작성자" 역할을 할당했다고 가정하면 다음과 같이 할 수 있습니다.

$article->roles()->syncWithoutDetaching([
    Role::where('name', 'author')->first()->id
]);
로그인 후 복사

마찬가지로 새 댓글을 만들고 해당 댓글 작성자에게 "댓글 작성자" 역할을 할당하면 다음과 같이 할 수 있습니다. :

$comment = new Comment();
$comment->content = 'This is a new comment.';
$comment->user_id = Auth::user()->id;
$comment->save();
$comment->roles()->syncWithoutDetaching([
    Role::where('name', 'commenter')->first()->id
]);
로그인 후 복사

이와 같은 코드를 사용하면 역할을 사용하여 누가 어떤 작업을 수행할 수 있는지 제어할 수 있습니다. 이제 새로운 사용자와 게시물 및 댓글에 적절한 역할을 자동으로 할당하고, 해당 기록이 삭제되면 역할 할당을 자동으로 제거하는 방법이 필요합니다.

2. Laravel의 이벤트 리스너를 사용하여 권한의 자동 할당 및 재활용을 실현합니다.

권한의 자동 할당 및 재활용을 실현하기 위해 Laravel 이벤트 시스템의 이벤트 리스너를 사용하여 관심 있는 이벤트를 캡처합니다. 이벤트 리스너는 애플리케이션별 이벤트 응답 기능을 등록하는 메커니즘입니다. 이 메커니즘을 사용하면 애플리케이션의 다양한 이벤트에 매우 유연하게 응답할 수 있습니다.

예를 들어 Laravel은 사용자가 생성 및 삭제될 때 자동으로 트리거되는 UserCreating 및 UserDeleting 이벤트를 제공합니다. 사용자가 생성될 때 필요한 역할 관계를 생성하고 삭제될 때 이 관계를 삭제하기 위해 이벤트 리스너를 작성할 수 있습니다.

먼저 새 이벤트 리스너를 정의해야 합니다.

class UserEventListener
{
    public function onUserCreating(UserCreating $event)
    {
        $user = $event->user;
        $roles = Role::where('name', 'user')->get();

        foreach ($roles as $role) {
            $user->roles()->create([
                'role_id' => $role->id,
            ]);
        }
    }

    public function onUserDeleting(UserDeleting $event)
    {
        $user = $event->user;
        $user->roles()->detach();
    }
}
로그인 후 복사

이 이벤트 리스너는 두 가지 메서드를 정의합니다. 한 가지 메소드(onUserCreating)는 사용자가 생성되고 사용자에게 "사용자" 역할을 할당할 때 자동으로 트리거됩니다. 사용자가 해당 역할과 관련된 모든 레코드를 삭제하면 또 다른 메소드(onUserDeleting)가 자동으로 실행됩니다.

다음으로 애플리케이션 서비스 제공자에 다음 이벤트 리스너를 등록해야 합니다.

class AppServiceProvider extends ServiceProvider
{
    protected $listen = [
        UserCreating::class => [
            UserEventListener::class,
        ],

        UserDeleting::class => [
            UserEventListener::class,
        ],
    ];

    public function boot()
    {
        //
    }
}
로그인 후 복사

이제 사용자를 생성하거나 삭제할 때 적절한 작업이 자동으로 수행됩니다. 역할 설치의 마지막 단계는 게시물과 댓글에 대해 유사한 이벤트 리스너를 정의하는 것입니다.

class ArticleEventListener
{
    public function onArticleCreating(ArticleCreating $event)
    {
        $article = $event->article;
        $roles = Role::where('name', 'author')->get();

        foreach ($roles as $role) {
            $article->roles()->create([
                'role_id' => $role->id,
            ]);
        }
    }

    public function onArticleDeleting(ArticleDeleting $event)
    {
        $article = $event->article;
        $article->roles()->detach();
    }
}

class CommentEventListener
{
    public function onCommentCreating(CommentCreating $event)
    {
        $comment = $event->comment;
        $roles = Role::where('name', 'commenter')->get();

        foreach ($roles as $role) {
            $comment->roles()->create([
                'role_id' => $role->id,
            ]);
        }
    }

    public function onCommentDeleting(CommentDeleting $event)
    {
        $comment = $event->comment;
        $comment->roles()->detach();
    }
}
로그인 후 복사

또한 이러한 리스너를 서비스 공급자의 해당 이벤트로 등록해야 합니다.

class AppServiceProvider extends ServiceProvider
{
    protected $listen = [
        UserCreating::class => [
            UserEventListener::class,
        ],

        UserDeleting::class => [
            UserEventListener::class,
        ],

        ArticleCreating::class => [
            ArticleEventListener::class,
        ],

        ArticleDeleting::class => [
            ArticleEventListener::class,
        ],

        CommentCreating::class => [
            CommentEventListener::class,
        ],

        CommentDeleting::class => [
            CommentEventListener::class,
        ],
    ];

    public function boot()
    {
        //
    }
}
로그인 후 복사

이제 자동 할당 및 권한 재활용을 구현하는 모든 단계를 완료했습니다. 이후 사용자, 기사 또는 댓글을 생성하면 해당 역할이 자동으로 할당됩니다. 이러한 기록이 삭제되면 관련 역할에서 자동으로 제거됩니다.

요약:

이 글에서는 Laravel에서 자동으로 권한을 할당하고 재활용하는 방법을 소개했습니다. 우리는 다형성 연관 기능과 이벤트 리스너를 사용하여 사용자, 역할, 게시물 및 댓글을 함께 연결하고 자동으로 역할을 할당하고 재활용했습니다. 동시에, Laravel에서 권한 관리를 구현하는 방법을 더 잘 이해할 수 있도록 자세한 코드 예제도 제공합니다.

위 내용은 Laravel에서 자동 할당 및 권한 재활용을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!