Laravel5.1.11에 추가된 Gate 시도(하나)

8089 단어 LaravelPHP

개요


Laravel5.1.11 사용자 권한 관리가 잘 되어 있기 때문에 Gate는 옵션이 추가된 것 같습니다.
상응하는 공식 문서는 여기에 있다
Authorization
공식 문서를 이해하고 소스를 간단하게 본 느낌은 다음과 같다.
1. routes.php와 비슷한 요령AuthServiceProvider에 따라 정책을 정의할 수 있습니다.
2. Gate fathod 검사 권한 등이 필요한 곳에 정의된 정책을 사용합니다.
3. Policy를 사용할 때 User 모드에서 xxxx 작업에 대한 정책을 xxxPolicy로 정의할 것 같습니다.
4. 로그인하지 않은 경우(User 비어 있음) 지정된 정책에 도달하기 전에 휴가를 반환합니까?
Policy 파일을 각 객체의 괄호로 분할하여
정책의 코드가 흐트러지지 않고 정리될 수 있을까, 권한 검사 논리가 쉽게 app/Policies보면 되는 단순한 상태가 될까

용도


화면 관리 등 흔한 열람만~추가 편집 가능 등 Role
앞쪽에서도 자신이 쓴 평론만 편집할 수 있다.
특히 권한 검사가 복잡해지기 쉬운 곳,
같은 콘텐츠에 대해 CRUD의 사람이 다른 상황에서 하나의 폴리시 클래스가 쉽게 귀납되는 장점을 느낄 수 있다.
권한 검사의 부분은 완전히 분리되고 테스트도 쉬워질 것 같아서 의미가 있다.
따라서 우선 흔한 패턴을 준비해 사용해야 한다.

환경 및 시작 전 상태


Laavel5.1.12 상태에 들어간다.
이번 기능은 5.1.1에 추가됐지만 버그픽스는 곧 5.1.2로 바뀌었다.

5.1.1 업그레이드하기


공식적인 업그레이드 지침을 보니 매우 빠르다.(영어)
http://laravel.com/docs/5.1/upgrade

이번 시험 샘플의 필요 조건


대략적으로 제작된 흔한 상황의 샘플을 사용하여 다음과 같은 조건으로 활용해 보세요.
  • 가입자는 로그인을 통해'보도'를 발표할 수 있다.
  • 자신이 투고한'문장'을 편집할 수 있다.
  • 자신이 기고한'글'을 삭제할 수 있다.
  • 등록 사용자는 기사에 주석을 쓸 수 있습니다.
  • 자신이 기고한'평론'을 편집할 수 있다.
  • 자신이 기고한'평론'을 삭제할 수 있다.
  • 자신의'글'에 기고한 다른 사용자의'평론'을 삭제할 수 있다.
  • 투고된'보도'와'평어'는 비로그인 사용자도 열람할 수 있다.
  • 관리자 권한을 가진 사용자는 모든 발언을 전부 조작할 수 있다
  • 파일 이름의 의미는 다음과 같습니다.
    사용자
    포스트
    Comment= 참고 사항

    일단 포스트부터 만들겠습니다.


    우선 관련 보도 부분에서 권한을 추가한다.

    포스트폴리시 만들기


    아래의 지령은artisan을 사용하여 모형을 만들 수 있으며, 할 수 있는 것은 구조기만 있다.composer create-project서류는 php artisan make:policy PostPolicy에서 제작되었다.
    생성된 초기 형태를 위해'문장'의 요구를 충족시키는 다음과 같은method를 추가합니다
  • 가입자는 로그인을 통해'보도'를 발표할 수 있다.
  • 자신이 투고한'문장'을 편집할 수 있다.
  • 자신이 기고한'글'을 삭제할 수 있다.
  • 실제 코드 샘플
    PostPolicy.php
        /**
         * 1. 登録ユーザーがログインすることで「記事」を投稿できる。
         * @return bool
         */
        public function create()
        {
            return true;
        }
    
        /**
         * 2. 自分が投稿した「記事」は編集が可能。
         * @param User $user
         * @param Post $post
         * @return bool
         */
        public function update(User $user, Post $post)
        {
            return $user->id == $post->user_id;
        }
    
        /**
         * 3. 自分が投稿した「記事」は削除が可能。
         * @param User $user
         * @param Post $post
         * @return bool
         */
        public function delete(User $user, Post $post)
        {
            return $user->id == $post->user_id;
        }
    
    

    PostPolicy용 AuthServiceProvider 설정

    app/Policies에 설정된 Policy.
    폴리시 등급이 만들어진다면 AuthServiceProvider에 추가하겠다.
    키는 대상 클래스 이름으로 설정해야 합니다.
    실제 코드 샘플
    AuthServiceProvider.php
        protected $policies = [
            'App\Model' => 'App\Policies\ModelPolicy',
            Post::class => PostPolicy::class,
        ];
    

    PostPolicy 사용


    이번엔 그냥 어떤 느낌으로 쓸지 간단하게 컨트롤러로 해보는 거야.$policies에서 객체로 제공되는 클래스 이름 읽기,
    이전 deniesAuthServiceProvider 배열키에 설정된 policies 를 자동으로 읽습니다.
    이런 느낌으로 여기저기 쫓아다니면서
    실제 코드 샘플
    PostController.php
            if (Gate::denies('update', $this->post)) {
                return redirect('/post')->with('message', '編集できるのは投稿者と管理者のみです。');
            }
    

    권한의 상태에 따라 글의 편집/삭제 단추의 표시를 제어합니다.


    권한이 없는 사용자에게 편집/삭제 단추를 표시하는 것도 방해일 뿐입니다.
    편집, 삭제 단추를 권한에 따라 최대한 많은 내용을 표시합니다.
    이룰 수 있는 방법도 준비해 주셔서 감사하게 사용하고 있습니다.
    실제 샘플 코드
    index.blade.php
        @can('update', $post)
        <a href="/post/{{ $post->id }}/edit" class="btn btn-primary">
            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> 編集
        </a>
        @endcan
        @can('delete', $post)
        <button class="btn btn-danger" data-toggle="modal" data-target="#exampleModal" data-whatever="/post/{{ $post->id }}">
            <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 削除
        </button>
        @endcan
    
    
    추가된 Policy를 사용하면 php 측의 방법을 사용할 수 있습니다.
    스크쇼크도 따 봤어요.
    엔지니어로 로그인했기 때문에, 'phper' 의 글에는 편집 삭제 단추가 표시되지 않습니다.

    길어졌기 때문에 여기서 격리한다


    다음에는 평론 부분의 실례로 써 보세요.
    썼어.
    Laravel5.1.11에 추가된 Gate 시도
    http://qiita.com/inaka_phper/items/c584904bb39673e2dc16
    둘째, 주로 여러 값을 Policy에 전달하는 방법입니다.
    추가@can에 대한 정의 방법, AuthServiceProvider$gate->before()에 대해서도 샘플을 만들어 보고 싶습니다.

    좋은 웹페이지 즐겨찾기