Skip to content

ユーザー、ロール、パーミッション設計

Kazane Shimizu edited this page Mar 1, 2023 · 1 revision

APIキーの持ち方について

  • サービスにより持ち方が異なる
    • 案1)apiキーをつくる
      • strapi、microCMS、newt
    • 案2)ユーザーごとにapiキーをもたせる
      • directus(userテーブルにtokenを持つ)、payload(userをjwt encodeしたトークンを使ってる)
  • メリデメ
    • 案1
      • メリット
        • 登録する人と使う人をわけて考えられる
        • apiキー数に制限を設けて収益化のトリガーにしてる
      • デメリット
        • ロールとapiキーそれぞれに、アクセス制限を付与するのが面倒
    • 案2
      • メリット
        • データの持ち方が楽
        • ロールでのみ制限を付与するので実装が楽
      • デメリット
        • 登録する人とAPI利用ユーザーが同一になる
    • 結論
      • 👉 案2のdirectusにする
      • セルフホストなので、apiキー数の制限による収益化はあまり意味がなく、実装を楽にするほうがメリット大きいので

スキーマ

  • userにtokenフィールドを追加
  • roleにpermissionsが one-to-many で紐づく関係上、簡素化するために、userとroleは one-to-oneにしました。

superfast_users

カラム名 タイプ 長さ NULL許可 キー デフォルト コメント
id int 11 primary
first_name varchar 255
last_name varchar 255
user_name varchar 255 YES
email varchar 255 unique
password varchar 255
is_active boolean 1 false
token varchar 255 YES APIトークン
role_id int 11 YES fk
created_at dateTime
updated_at dateTime

superfast_roles

カラム名 タイプ 長さ NULL許可 キー デフォルト コメント
id int 11 primary
name varchar 255 unique
description varchar 255 YES
admin_access boolean 1 false admin内の全機能へのアクセス
created_at dateTime
updated_at dateTime

superfast_permissions

roleとpermissionは、dependent: :destroy の関係

カラム名 タイプ 長さ NULL許可 キー デフォルト コメント
id int 11 primary
collection varchar 255
action varchar 255 'create' / 'read' / 'update' / 'delete'
role_id int 11 fk
created_at dateTime
updated_at dateTime

※ directusでは、各actionごとに操作できるフィールドが設定できるが、初期はスコープ外

users_roles_links

👉 廃止

API IF

自分のユーザー情報の取得

GET /api/me

例)http://localhost:8080/api/me

レスポンス1(管理者)

user: {
  id: 1,
  first_name: '山田太郎',
  ...,
  role: {
    id: 1,
    name: 'Administrator',
    adminAccess: true,
    permissions: []  
  }
}

レスポンス2(エディター) adminAccess=falseの場合は、permissionsで機能制御する

user: {
  id: 1,
  first_name: '山田太郎',
  ...,
  role: {
    id: 1,
    name: 'Editor',
    adminAccess: false,
    permissions: [
      {
        id: 1,
        collection: 'Restraunt',
        action: 'read'
      },
      {
        id: 2,
        collection: 'Menu',
        action: 'read'
      },
      {
        id: 3,
        collection: 'Menu',
        action: 'create'
      },
      {
        id: 4,
        collection: 'Menu',
        action: 'update'
      } 
    ]  
  }
}

リフレッシュトークン

jwtのexpを延長する(使っている間は、ログインし続けている) POST /api/refresh-token

user一覧の取得

GET /api/users

リクエストパラメータについては、こちらを参照

userの取得

GET /api/users/:id

userの登録

POST /api/users

userの更新

PUT /api/users/:id

userの削除

DELETE /api/users/:id

role一覧の取得

GET /api/roles

リクエストパラメータについては、こちらを参照

rolesの取得

GET /api/roles/:id

roleの登録

POST /api/roles

roleの更新

PUT /api/roles/:id

roleの削除

DELETE /api/roles/:id

permissionの登録

POST /api/roles/:id/permissions

permissionの削除

POST /api/roles/:id/permissions/:id

初期対象外

  • フィールドパーミッションは対応しない