会員登録すると
学習することができます。
会員登録する(無料)
学習することができます。
登録済みの方はこちら
ログイン
学ぶ目的
認可は3つの問いでできている
| 問い | 呼び方 | 例 |
|---|---|---|
| このデータは誰のものか | 所有者 | この応募は、この会員のもの |
| この人はどんな立場か | ロール(役割) | 閲覧者・編集者・管理者 |
| その立場で何をしてよいか | 権限 | 読む・直す・消す |
所有者は「データの探し方」で確かめる
講座31の第3回で見たとおり、IDだけでデータを探すと、IDを書き換えられたときに他人のデータが出てきます。「持ち主の中から探す」形にしておけば、判定を書き忘れることがありません。
ログインしていない人のデータでは、どうでしょう。naminori の AIキャリア診断は、登録しなくても答えられます。持ち主は次のように確かめています。
- 診断を始めたときに、長いランダムな秘密の値を作る
- ブラウザには、暗号化した Cookie で渡す。JavaScript からは読めず、HTTPS でしか送られない設定にする
- サーバーには、秘密の値そのものではなく照合用の値だけを保存し、診断は秘密の値で探す。だから、診断の番号を書き換えても他人の診断は出てこない
- 会員登録・ログインしたら、診断を会員に結びつけて Cookie を消す。以後は「会員の持ち物」として探す
ロールと権限を分ける
画面のコードが「この人は管理者か」を直接聞くと、ロールが増えるたびに全部の判定を直すことになります。間にロールから権限を引く表を1つ置きます(Ruby で確認)。
PERMISSIONS = {
viewer: %i[read],
editor: %i[read update],
owner: %i[read update delete]
}.freeze
def can?(role, action) = PERMISSIONS.fetch(role, []).include?(action)
can?(:viewer, :update) # => false
can?(:editor, :update) # => true
can?(:unknown, :read) # => false
画面のコードは「この操作をしてよいか」だけを聞きます。ロールを足すときは表に1行足すだけです。表に無いロールは何もできません(既定は拒否)。
後から困ること
- 管理者を真偽値1つで作る。 半年後に「閲覧だけの管理者」「求人だけ直せる人」が必要になると、全画面に散らばった「管理者なら」の判定を1つずつ書き換えることになります
- 判定を画面ごとに書く。 API や AI アプリの接続など新しい入口を足したとき、そちらで判定が漏れます
- 既定を「許可」にする。 新しい画面を足して判定を書き忘れると、誰でも使えます
naminori の例:判定を1か所に集める
naminori の管理用の AI 接続では、どの操作も同じ1か所の判定を通ります。順番は次のとおりです。
- そのデータは、AI から触れてよい対象か
- この接続に許された範囲か
- 書き込みなら、そのデータが書き込める対象で、接続の段階で許されているか
- 削除なら、そのデータが削除してよい対象か(消すと利用者のデータまで連鎖して消えるものは消せない)
接続の段階は「参照のみ/作成・更新まで/削除まで」の3つで、段階から「できる操作」を引く形にしています。
このレクチャーで学ぶこと
- 所有者・ロール・権限の3つの問い
- ログインしていない人の持ち主を確かめる(naminori の診断)
- ロールから権限を引く表を1つ置く(手元で確認)
- 判定を1か所に集め、既定は拒否にする
質問
まだ質問は投稿されていません。
質問投稿
ログイン後に質問の投稿ができます。
#1
未完了
認証と認可を分けて設計する ― 「誰か」と「何をしてよいか」は別の問い
#2
未完了
セッションとトークン ― 有効期限と「止め方」を最初に決める
#3
未完了
パスワードとログイン試行 ― 後から強くでき、本人を締め出さず、登録の有無を漏らさない
#4
未完了
多要素認証と復旧 ― 「スマホを失くした日」を先に設計する
#5
未完了
OAuth 2.0 と OpenID Connect ― パスワードを渡さずに「代わりに」入らせる
#6
未完了
認可モデル ― 所有者・ロール・権限を、1か所で判定する
#7
未完了
特権の扱い ― 管理者と代理ログインを「普通の権限」と分ける
#8
未完了