質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

419閲覧

記事編集画面を作る時のルーティングについて

tarofess

総合スコア127

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/02/27 12:22

現在投稿した記事を編集できる機能を作成しているのですが、記事編集画面の作り方でどうしようかと悩んでいます。
まず記事画面に以下のような編集ボタンがあります。

html

1<a href="/edit-post/{{ $article->id }}" class="btn btn-success">編集</a>

このボタンを押すと以下のルーティングの通りにControllerのメソッドを呼びます。

php

1Route::get('/edit-post/{id}', 'PostController@edit');

そして該当のControllerのメソッドは以下のようになっており、記事編集画面が表示されます。
なお、記事編集画面は記事投稿画面を再利用しています。

php

1 public function edit($id) { 2 $article = DB::table('articles')->where('id', $id)->first(); 3 return view('post', ['isEditing' => true, 'article' => $article]); 4 }

必要な記事情報と共に記事編集画面が表示されるのはいいのですが、アドレスバーに「/edit-post/任意の数字」と打つと他人の記事が編集できてしまいます。
なので/edit-post/*のURLの直接入力によるアクセスを禁止したいのですが、どうすればいいでしょうか?
また、試しに以下のように擬似フォームメソッドでアクセスするとURLの直接入力でのアクセスを禁止できたのですが、PUTを使っているのに画面を表示させているのは設計上よろしくないでしょうか...?

php

1<form action="/edit-post" method="POST"> 2 <input type="hidden" name="_method" value="PUT"> 3 <input type="hidden" name="_token" value="{{ csrf_token() }}"> 4 <input type="hidden" name="id" value="{{ $article->id }}"> 5 <input type="submit" value="編集" class="btn btn-success"> 6</form>

ルーティングは以下のような感じで、Controllerで記事情報を取得して記事編集画面を表示しているだけです。

php

1Route::put('/edit-post', 'PostController@edit');

このように記事編集画面を作る際、どのようにすればいいでしょうか?
どなたか分かる方がいれば教えていただきたいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自身の記事のみの参照・編集などの、ある処理に対して権限を判定するにはLaravelには認可という機能が備わっているので検討してみて下さい。
Laravel 5.5 認可
標準機能としては各個々の権限なので、役割として権限のセットをまとめたい時は、laravel-permissionの利用などを検討してみて下さい。
spatie/laravel-permission
laravel-permissionの使い方

投稿2018/02/28 01:08

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarofess

2018/02/28 13:28

ご回答ありがとうございます。 laravel-permissionというものもあるのですね。 マニュアルには認可を扱うにはモデルクラスを定義しておかなければいけなさそうなのですが、モデルクラスがない場合は認可は使えないのでしょうか?
aro10

2018/03/01 09:24

ポリシーにはモデルが必要ですが、ゲートには、Gate::defineでクロージャ等で記述すれば、自由に判定ロジックを組めます。ドキュメントを確認してみて下さい。
tarofess

2018/03/01 13:25

Gate::defineでクロージャでやるとやりたいことが実現できました。色々と参考になりました。ありがとうございました。
guest

0

ベストアンサー

一般的には最初から用意されている Gate, Policy を利用するのがいいと思います。

https://laravel.com/docs/5.6/authorization

詳しくはマニュアルにそのもののサンプルが書かれているので省略しますが、Policy ファイルを作って update() 時に記事の編集許可がない場合は拒否するようにすれば実現できると思います。


追記

小規模なものであれば Policy クラスを作成しなくても構いません。

App\Providers\AuthServiceProvider

public function boot() { $this->registerPolicies(); Gate::define('update-post', function ($user, $post) { // 記事の作成者IDとログインユーザーのIDが一致するか調べる return $user->id == $post->user_id; }); }

コントローラーの各種メソッド内

$post = DB::table('posts')->where('id', '=', $id)->first(); if(Gate::denies('update-post', $post)) { // 許可がなかった場合の処理 abort(403, 'Forbidden'); }

投稿2018/02/28 01:06

編集2018/03/01 01:39
workr

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarofess

2018/02/28 13:23

ご回答ありがとうございます。 GateとPolicyというものがあるのですね。 マニュアルにはAuthServiceProviderの$policiesには、 Post::class => PostPolicy::class とあり、このPostはモデルクラスだと思うのですが、モデルクラスがない場合はどのようにこれらを使えばいいでしょうか? 今Articleクラスなどのモデルクラスは作成していないので、どのようにGateとPolicyを使えばいいか分かりません......。
workr

2018/03/01 01:41

具体的な方法について追記しました。モデルクラスは作るべきだと思いますが事情があるのなら無くても機能は実装できます。
tarofess

2018/03/01 13:24

ご提示のコードのようにするとやりたいことが実現できました。 誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問