現在、laravelの日本語訳ドキュメントを参考にして認可について学習している初学者です。
初めて認可(ポリシー)の実装を試みている為、根本的に誤解している可能性がございます。
その際はご指摘のほどよろしくお願いいたします。
##分からないこと
Laravel DebugbarのGate欄にて、下記のエラーが発生しており、どのように解決すべきかを知りたく質問させていただきます。
array:4 [▼ "ability" => "update" "result" => null "user" => 1 "arguments" => "[0 => Model]" ]
##試したこと
過去の質問を参考に、回答欄に書かれていることを試しましたが解決に至りませんでした。
認可を実装し、アプリケーション上でログイン済みの状態でログインユーザーのidと投稿のuser_idが一致している投稿の更新を行ったところエラーは発生しませんでした。
開発環境
laravel 6.20.16
php 7.4.15
下記にポリシーを実装した手順と詳細を記載いたします。
###1.ArticlePolicyを作成
php artisan make:policy PostPolicy --model=Article
でArticlePolicyを作成。
updateメソッドで、ログインしているユーザーのIDとArticle(投稿)のuser_idが一致している場合のみ更新できるように設定。
<?php namespace App\Policies; use App\Models\Article; use App\Models\User; use Illuminate\Auth\Access\HandlesAuthorization; class ArticlePolicy { use HandlesAuthorization; /** * Determine whether the user can view any articles. * * @param \App\Models\User $user * @return mixed */ public function viewAny(?User $user) { return true; } /** * Determine whether the user can view the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function view(?User $user, Article $article) { return true; } /** * Determine whether the user can create articles. * * @param \App\Models\User $user * @return mixed */ public function create(User $user) { return true; } /** * Determine whether the user can edit the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function update(User $user, Article $article) { return $user->id === $article->user_id; } /** * Determine whether the user can delete the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function delete(User $user, Article $article) { return $user->id === $article->user_id; } /** * Determine whether the user can restore the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function restore(User $user, Article $article) { // } /** * Determine whether the user can permanently delete the article. * * @param \App\Models\User $user * @param \App\Models\Article $article * @return mixed */ public function forceDelete(User $user, Article $article) { // } }
//App\Models\Article.phpのuserモデルとのリレーション設定 public function user(): BelongsTo { return $this->belongsTo('App\Models\User'); } //App\Models\User.phpのArticleモデルとのリレーション設定 public function articles(): HasMany { return $this->hasMany('App\Models\Article'); }
###2.AuthServiceProviderに登録
<?php namespace App\Providers; use App\Models\Article; use App\Policies\ArticlePolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ Article::class => ArticlePolicy::class, ]; //略 }
###3.ArticleControllerで認可を使用
リソースコントローラを活用している為、コントローラのコンストラクタの中でauthorizeResourceメソッドを使用
<?php namespace App\Http\Controllers; use App\Models\Article; use App\Models\Tag; use Illuminate\Http\Request; use App\Http\Requests\Article\StoreRequest; use App\Http\Requests\Article\UpdateRequest; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; class ArticleController extends Controller { public function __construct() { $this->authorizeResource(Article::class, 'article'); } // public function update(UpdateRequest $request, Article $article) { $article->fill($request->validated())->save(); return redirect()->route('articles.index')->with('msg_success', '投稿を編集しました'); } //
//web.php ArticleControllerに関するルーティング Route::resource('/articles', 'ArticleController')->except(['create'])->middleware('auth'); Route::post('/articles/create', 'ArticleController@create')->name('articles.create')->middleware('auth');
初歩的な質問で申し訳ございませんが、よろしくお願いいたします。
あなたの回答
tips
プレビュー