-
Notifications
You must be signed in to change notification settings - Fork 4
ユーザー、ロール、パーミッション設計
Kazane Shimizu edited this page Mar 1, 2023
·
1 revision
- サービスにより持ち方が異なる
- 案1)apiキーをつくる
- strapi、microCMS、newt
- 案2)ユーザーごとにapiキーをもたせる
- directus(userテーブルにtokenを持つ)、payload(userをjwt encodeしたトークンを使ってる)
- 案1)apiキーをつくる
- メリデメ
- 案1
- メリット
- 登録する人と使う人をわけて考えられる
- apiキー数に制限を設けて収益化のトリガーにしてる
- デメリット
- ロールとapiキーそれぞれに、アクセス制限を付与するのが面倒
- メリット
- 案2
- メリット
- データの持ち方が楽
- ロールでのみ制限を付与するので実装が楽
- デメリット
- 登録する人とAPI利用ユーザーが同一になる
- メリット
- 結論
- 👉 案2のdirectusにする
- セルフホストなので、apiキー数の制限による収益化はあまり意味がなく、実装を楽にするほうがメリット大きいので
- 案1
- userにtokenフィールドを追加
- roleにpermissionsが one-to-many で紐づく関係上、簡素化するために、userとroleは one-to-oneにしました。
カラム名 | タイプ | 長さ | NULL許可 | キー | デフォルト | コメント |
---|---|---|---|---|---|---|
id | int | 11 | primary | |||
first_name | varchar | 255 | ||||
last_name | varchar | 255 | ||||
user_name | varchar | 255 | YES | |||
varchar | 255 | unique | ||||
password | varchar | 255 | ||||
is_active | boolean | 1 | false | |||
token | varchar | 255 | YES | APIトークン | ||
role_id | int | 11 | fk | |||
created_at | dateTime | |||||
updated_at | dateTime |
カラム名 | タイプ | 長さ | 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 |
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ごとに操作できるフィールドが設定できるが、初期はスコープ外
👉 廃止
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
GET /api/users
リクエストパラメータについては、こちらを参照
GET /api/users/:id
POST /api/users
PUT /api/users/:id
DELETE /api/users/:id
GET /api/roles
リクエストパラメータについては、こちらを参照
GET /api/roles/:id
POST /api/roles
PUT /api/roles/:id
DELETE /api/roles/:id
POST /api/roles/:id/permissions
POST /api/roles/:id/permissions/:id
- フィールドパーミッションは対応しない