Laravelでポリシーを使用してユーザー認証を完了する方法の例

小云云
リリース: 2018-03-13 14:47:46
オリジナル
2327 人が閲覧しました

Laravel は、ユーザー認証アクションを処理する簡単な方法を提供します。ユーザー認証と同様に、Laravel にはユーザー認証を実装するための主な方法が 2 つあります: ゲートとポリシーです。ここで Policy の使用状況を記録します。 Policy を使用してユーザー認証を完了するには、主に 3 つの手順が含まれます:

ポリシー クラスを定義する
ポリシー クラスとモデルの関連付けを登録する
ポリシーの判断

ポリシー クラスを定義する

ポリシーは、特定のモデルまたはリソース 論理クラス。たとえば、アプリケーションがブログの場合、ブログの作成や更新、ブログの削除などのユーザー アクションを承認するための Post モデルと対応する PostPolicy が存在します。

この時点で、artisan コマンドを使用してポリシー クラスを作成できます。次のコマンドは空の Post ポリシー クラスを作成します

php artisan make:policy PostPolicy
ログイン後にコピー
ログイン後にコピー

生成されたポリシーは app/Policies ディレクトリに配置されます。このディレクトリがアプリケーションに存在しない場合は、Laravel が自動的に作成します

CURD を含むポリシークラスを生成したい場合は、次の職人コマンドを使用できます

php artisan make:policy PostPolicy --model=Post
ログイン後にコピー
ログイン後にコピー

ポリシークラスとモデルの関連付けを登録します

ポリシーを登録しますAuthServiceProvider クラス内で

    protected $policies = [        //'App\Model' => 'App\Policies\ModelPolicy',  这个是laravel中默认注册了的policy,可以模仿这个注册我们自己的policy        'App\Post' => 'App\Policies\PostPolicy', //注册Post的policy
    ];
ログイン後にコピー
ログイン後にコピー

ポリシー クラスとモデルの間の関連付けは、ポリシー内にポリシー メソッドを記述することです

<?phpnamespace App\Policies;use App\User;use App\Post;use Illuminate\Auth\Access\HandlesAuthorization;class PostPolicy{
    use HandlesAuthorization;    /**
     * Determine whether the user can update the post.
     *
     * @param  \App\User  $user
     * @param  \App\Post  $post
     * @return mixed
     */
    public function update(User $user, Post $post)
    {
        //
        return $user->id === $post->user_id;
    }    /**
     * Determine whether the user can delete the post.
     *
     * @param  \App\User  $user
     * @param  \App\Post  $post
     * @return mixed
     */
    public function delete(User $user, Post $post)
    {
        //
        return $user->id === $post->user_id;
    }
ログイン後にコピー
ログイン後にコピー

update メソッドは、User インスタンスと Post インスタンスをパラメータとして受け取り、ユーザーが指定された投稿を更新する権限を与えられています。そこで、この例では、ユーザーのIDが投稿のuser_idと一致するかどうかを判定し、

戦略判定

ここではコントローラー内のコントローラー補助機能を使ってポリシー判定を行っています

//文章编辑逻辑
    public function update(Post $post)
    {
        $this->validate(request(),[            &#39;title&#39;      => &#39;required|String|min:5|max:50&#39;,            &#39;content&#39;    => &#39;required|String|min:10&#39;,
        ]);
        $this->authorize(&#39;update&#39;,$post);         ////////////////////策略判断
        $post->title = request(&#39;title&#39;);
        $post->content = request(&#39;content&#39;);
        $post->save();        return redirect("/posts/{$post->id}");
    }    //文章删除
    public function delete(Post $post)
    {        //TODO::权限验证
        $this->authorize(&#39;delete&#39;,$post);           //////////////////策略判断
        $post->delete();        return redirect(&#39;/posts&#39;);
    }
ログイン後にコピー
ログイン後にコピー

検証が失敗する限り、laravelはHttpException が自動的にスローされます。このアクションは許可されていません。

開発中、ビュー内の編集ボタンや変更ボタンなど、一部のボタンを表示するかどうかを決定する必要がある場合があります。ブレードでは @can を使用して実行できます。モデルボタンを表示するかどうかを指定します

Laravel は、ユーザー認証アクションを処理する簡単な方法を提供します。ユーザー認証と同様に、Laravel にはユーザー認証を実装するための主な方法が 2 つあります: ゲートとポリシーです。

ポリシーの使用法をここに記録します。ポリシーを使用してユーザー認証を完了するには、主に 3 つの手順が含まれます:

ポリシー クラスを定義する
ポリシー クラスとモデルの関連付けを登録する
ポリシーの判断

ポリシー クラスを定義する

ポリシーは特定のモデルまたはリソースにある認可ロジックを構成するクラス。たとえば、アプリケーションがブログの場合、ブログの作成や更新、ブログの削除などのユーザー アクションを承認するための Post モデルと対応する PostPolicy が存在します。

この時点で、artisan コマンドを使用してポリシー クラスを作成できます。次のコマンドは空の Post ポリシー クラスを作成します

php artisan make:policy PostPolicy
ログイン後にコピー
ログイン後にコピー

生成されたポリシーは app/Policies ディレクトリに配置されます。このディレクトリがアプリケーションに存在しない場合は、Laravel が自動的に作成します

CURD を含むポリシークラスを生成したい場合は、次の職人コマンドを使用できます

php artisan make:policy PostPolicy --model=Post
ログイン後にコピー
ログイン後にコピー

ポリシークラスとモデルの関連付けを登録します

ポリシーを登録しますAuthServiceProvider クラス内で

    protected $policies = [        //&#39;App\Model&#39; => &#39;App\Policies\ModelPolicy&#39;,  这个是laravel中默认注册了的policy,可以模仿这个注册我们自己的policy        &#39;App\Post&#39; => &#39;App\Policies\PostPolicy&#39;, //注册Post的policy
    ];
ログイン後にコピー
ログイン後にコピー

ポリシー クラスとモデルの間の関連付けは、ポリシー内にポリシー メソッドを記述することです

<?phpnamespace App\Policies;use App\User;use App\Post;use Illuminate\Auth\Access\HandlesAuthorization;class PostPolicy{
    use HandlesAuthorization;    /**
     * Determine whether the user can update the post.
     *
     * @param  \App\User  $user
     * @param  \App\Post  $post
     * @return mixed
     */
    public function update(User $user, Post $post)
    {
        //
        return $user->id === $post->user_id;
    }    /**
     * Determine whether the user can delete the post.
     *
     * @param  \App\User  $user
     * @param  \App\Post  $post
     * @return mixed
     */
    public function delete(User $user, Post $post)
    {
        //
        return $user->id === $post->user_id;
    }
ログイン後にコピー
ログイン後にコピー

update メソッドは、User インスタンスと Post インスタンスをパラメータとして受け取り、ユーザーが指定された投稿を更新する権限を与えられています。そこで、この例では、ユーザーのIDが投稿のuser_idと一致するかどうかを判定し、

戦略判定

ここではコントローラー内のコントローラー補助機能を使ってポリシー判定を行っています

//文章编辑逻辑
    public function update(Post $post)
    {
        $this->validate(request(),[            &#39;title&#39;      => &#39;required|String|min:5|max:50&#39;,            &#39;content&#39;    => &#39;required|String|min:10&#39;,
        ]);
        $this->authorize(&#39;update&#39;,$post);         ////////////////////策略判断
        $post->title = request(&#39;title&#39;);
        $post->content = request(&#39;content&#39;);
        $post->save();        return redirect("/posts/{$post->id}");
    }    //文章删除
    public function delete(Post $post)
    {        //TODO::权限验证
        $this->authorize(&#39;delete&#39;,$post);           //////////////////策略判断
        $post->delete();        return redirect(&#39;/posts&#39;);
    }
ログイン後にコピー
ログイン後にコピー

検証が失敗する限り、laravelはHttpException が自動的にスローされます。このアクションは許可されていません。

開発中、ビュー内の編集ボタンや変更ボタンなど、一部のボタンを表示するかどうかを決定する必要がある場合があります。ブレードでは @can を使用して実行できます。モデルボタンを表示するかどうかを指定します。

以上がLaravelでポリシーを使用してユーザー認証を完了する方法の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!