🎃

権限制御はSQLですべきだと思う理由

2021/10/03に公開

良くないと思う実装

  1. あるオペレーションを行う権限があるかどうかをチェックするため、DBを参照
  2. 権限がなかった場合、エラーを表すコードを返却
  3. 権限があった場合、DBにクエリを発行し、成功を表すコード等を返却

なぜ上記の実装が良くないと思うか

  • 1.時点で参照したDBの状態と、3.時点で変更を加えるDBの状態が同じとは限らない
  • 通信は1回で済ませた方がお得

ではどうするか

例えば、TODOアプリを作っていたとする。

「TODOを削除できるのは、TODOを作った本人のみである」という要件があったとする。

その場合に、TODOを削除するクエリは下記のようにすればいい。

DELETE FROM todos WHERE id=:id AND creation_account_id=:accountId

リクエストをしているアカウントのIDが、TODOを作成したアカウントのIDと一致しなければ、DELETEの結果は0件になり、そうでない場合は1件になる。

削除件数が0件なら404、1件なら200を返すことができる。

ロールが絡む場合などあると思うが、良ければ下記の記事を参考にしてほしい。

https://zenn.dev/coder_ka/articles/0dac68a1035080

Discussion