誰が何をできるか
本人確認と権限確認は別
予約を取り消せるのは誰か、を決めます。
ここで2つの確認が要ります。あなたは誰かと、その人にその操作を許すかです。
前者が本人確認、後者が権限確認です。似ていますが、別の作業です。
済んでいるのは前者だけです。
ログインしている人が、他人の予約を取り消そうとすることはあります。誰かが分かったことと、その操作を許すことは別です。
順番を守る
先に本人確認、そのあと権限確認です。逆にすると穴が開きます。
Python
# 1. 誰か分からない → 断る
# 2. 管理者なら許す
# 3. 自分の予約なら許す
# 4. それ以外は断る未ログインの相手の役割は、こちらが決めたものではありません。
要求に書かれた役割をそのまま信じると、誰でも管理者を名乗れます。 先に誰かを確かめ、確かめた情報から役割を引きます。
順番は速さのためではなく、信じてよい情報の順です。
断った理由も分けて返す
断るときの理由は、1つにまとめないほうが役に立ちます。
「本人確認が済んでいない」ならログインを促し、「他人の予約」ならログインし直しても解決しません。
呼ぶ側の次の一手が違うので、返す理由も分けます。
なる場面はあります。予約IDを総当たりする相手に「他人の予約」と返すと、そのIDが実在すると教えることになります。
守りたいものによって、外に返す文言と、ログに残す理由を分けます。画面には同じ文言を出し、詳しい理由はログにだけ書く形です。
この演習では中の判断を作るので、理由をそのまま返します。
演習
操作する人と予約を受け取り、取り消してよいかと理由を返します。
要件
- actor の id が None なら allowed は False、reason は "本人確認が済んでいない"
- そうでなく role が "admin" なら allowed は True、reason は "管理者"
- そうでなく予約の owner が actor の id と同じなら True で "本人の予約"、違えば False で "他人の予約"
ヒント
編集 ゆめさく編集部