演習課題「新規投稿時に、user_idカラムを保存する」
右の環境には、Laravelで「mydiary」ディレクトリに日記アプリを作成してあります。ArticleモデルはUserモデルと関連付けてあります。
このアプリで、新規投稿時に、user_idカラムを保存してください。
採点して、すべてのジャッジに正解すれば、演習課題クリアです!
※ 採点時は、サーバを起動し、問題文に関するページにアクセスできる状態にしてください。
#08:自分で投稿したお店情報のみ、更新・削除できるようにしよう
ここでは、自分で投稿したお店情報だけ、更新・削除できるようにします。そのために、新規投稿時に、user_idカラムを保存します。
kirisima:
- Email: info@paiza.jp
- Password: k1r1s1m@
paiza:
- Email: foo@paiza.jp
- Password: p3a.i1z4a
app/Http/Controllers/ShopController.php/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$shop = new Shop;
$user = \Auth::user();
$shop->name = request('name');
$shop->address = request('address');
$shop->category_id = request('category_id');
$shop->user_id = $user->id;
$shop->save();
return redirect()->route('shop.detail', ['id' => $shop->id]);
}
app/Http/Controllers/ShopController.php /**
* Display the specified resource.
*
* @param \App\Shop $shop
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$shop = Shop::find($id);
$user = \Auth::user();
if ($user) {
$login_user_id = $user->id;
} else {
$login_user_id = "";
}
return view('show', ['shop' => $shop, 'login_user_id' => $login_user_id]);
}
resources/views/show.blade.php<div>
<a href={{ route('shop.list') }}>一覧に戻る</a>
@auth
@if ($shop->user_id === $login_user_id)
| <a href={{ route('shop.edit', ['id' => $shop->id]) }}>編集</a>
<p></p>
{{ Form::open(['method' => 'delete', 'route' => ['shop.destroy', $shop->id]]) }}
{{ Form::submit('削除', ['class' => 'btn btn-outline-danger']) }}
{{ Form::close() }}
@endif
@endauth
</div>
実際にアプリケーションを公開する際には、これだけではアクセス制御が不十分です。
この講座では要点を簡単に学ぶために「投稿者でなかった場合に編集・削除のリンクを表示させない」という処理を行っていますが、
たとえば「編集のURLが/diary/edit/{id}
であることを知っている人」にはURLを手打ちで編集ページにアクセスされてしまう可能性があります。
また、HTTPの規約に則ってPOSTでデータを登録するようにアプリケーションを作りましたが、
登録ページを経由せずに直接POSTリクエストを投げられた場合にもデータの登録を許してしまいます。
このように、ページだけでなくアプリケーション側でも「本当に投稿者本人なのか?」を確認する処理が必要ですので、
実際にアプリケーションを公開する際にはご注意ください。
Laravel5.7: 認可 (記事の編集はオーナーに限る、などの制限) - Qiita
https://qiita.com/sutara79/items/11d8417a6fc91ca1b841
- 認可 5.7 Laravel
https://readouble.com/laravel/5.7/ja/authorization.html
- Bladeテンプレート 5.7 Laravel
https://readouble.com/laravel/5.7/ja/blade.html
- Laravelで爆速API開発シリーズ「認可編」 | WINDII
https://windii.jp/laravel/authorization