🛠
Laravelで依頼マッチングサービス『Requste』を作り始めた
はじめに
なぜこのプロダクトを作ろうと思ったか
SNS上には、
イラストが上手く、単価も良心的なのに
他のクリエイターに埋もれてしまっている方が数多くいます。
それを見るたびに、
「運や見られ方だけで評価されず、埋もれてしまうのは
あまりにもったいない」と強く感じてきました。
実力はあるのに、実績がないという理由だけで
仕事を得にくいクリエイターがいる。
そんな方々に、
活躍の機会を届けたい。
その想いから、このプロダクトを作ろうと思いました。
Requste(リクステ)仕様まとめ(MVP)
サービス概要
『Requste(リクステ)』は、
依頼者(Client)と制作者(Creator)をつなぐ、依頼マッチングサービス
のMVPです。
想定ユーザーとロール
本サービスでは、すべての利用者を User として統一管理し、
ロールによって役割を切り替える設計を採用しています。
-
Client
依頼(案件)を作成・管理するユーザー -
Creator
依頼を閲覧し、将来的に受注するユーザー -
Admin
運営管理用(MVPでは画面未実装、将来拡張用)
ロールは enum(UserRole) で管理し、
将来ロールが増えても拡張しやすい設計にしています。
現在実装済みの機能
Client 機能
ログイン
自分が作成した案件の一覧表示
案件が0件の場合の正常表示
共通
ロールによるアクセス制御
不正アクセス時の 403 制御
MVC(Route → Controller → View)の基本構造
今回やったこと
- 認証
- ロール設計
詰まったところ
許可されていないロールでも特定の画面を閲覧できたこと
その時実装していたのが以下のコード
if (!$user && in_array($user->role->value, $roles, true)) {
abort(403);
}
一見問題ないように見えるが、論理が破綻している
これを日本語に翻訳すると
「ユーザーが存在しない かつ ユーザーの role が許可 $roles に含まれている場合」→ 403 を表示
となる。
・ユーザーが存在しない
・ユーザーの role が許可 $roles に含まれている場合
ユーザーが存在していないのに、そのユーザーのrolesについて確認していることになるため403が起動しなかった。
修正後の条件
この部分のミドルウェアの責務は
・ログインしていない → 拒否
・ログインしているが role が違う → 拒否
・それ以外 → 通す
となるため、これを表現する必要がある。
そのため、
if (! $user || ! in_array($user->role->value, $roles, true)) {
abort(403);
}
と修正。
この論理にしたところ問題なく 403 表示となった。
このことから学んだこと
- 拒否条件は「通したくない条件」
- role 判定は 否定形で書く方が安全
- AND / OR は日本語に直してから書く
となった。
次にやること
MVP フェーズ1の予定
・案件作成機能(client)
・案件詳細ページ
・案件の公開 / 非公開(または受付中 / 終了)
Discussion