コンテンツにスキップ

06. 権限一覧

「誰が何をできるか」の一覧です。

この表はテストと同じ内容です (core/common/tests/test_action_permissions.py の許可リスト)。 表を直すときはテストも直してください。片方だけ変えると、 テストが落ちるか、仕様書が嘘になります。

4 種類の利用者

呼び方 中身 どこから入るか
Gipple 管理者 サービスの運営者 admin.redpl.app
企業アカウント 会社全体の管理者(owner) {会社の識別名}.redpl.app
事業所アカウント 決まった事業所の担当者(member) 同上
スタッフ 働く人 同上

企業アカウントと事業所アカウントは、できる操作は同じです。 違うのは見える範囲だけです。

アカウント 見える範囲
企業アカウント 会社の全事業所(ただし画面では 1 つ選んで操作します)
事業所アカウント 割り当てられた事業所だけ

以下の表では、この 2 つをまとめて「クライアント」と書きます。

見える範囲の決まり

利用者 絞られ方
Gipple 管理者 絞りません。全部の会社が見えます
クライアント URL で決まる会社 かつ ヘッダーで選んでいる事業所
スタッフ URL で決まる会社 かつ 自分のデータだけ

URL の会社と、ログイン情報の中の会社が食い違うときは断ります(403)。 URL を書き換えて他の会社を見ようとする操作を止めるためです。


画面ごとの可否

○ = 使える、× = 使えない

画面 管理者 クライアント スタッフ
A-01〜A-13 管理画面すべて ○ × ×
C-01〜C-20 クライアント画面すべて ○ ○ ×
S-01〜S-10 スタッフ画面すべて × × ○
X-01 招待からの登録 ○ ○ ○
X-02 トップページ ○ ○ ○

X-01 と X-02 はログインしていなくても開けます。


API の一覧(標準の操作)

API 管理者 クライアント スタッフ 備考
/api/auth/login/ ○ ○ ○ ログイン前でも呼べます
/api/auth/logout/ ○ ○ ○
/api/auth/me/ ○ ○ ○ 自分の情報。初回パスワード変更の前でも呼べます
/api/auth/token/refresh/ ○ ○ ○ ログイン状態を保つ裏側の仕組み
/api/auth/change-password/ ○ ○ ○ 自分のパスワードだけ
/api/auth/accounts/ ○ × × アカウントの一覧・発行
/api/auth/accounts/{user_id}/ ○ × ×
/api/auth/accounts/{user_id}/lock/ ○ × ×
/api/auth/accounts/{user_id}/unlock/ ○ × ×
/api/auth/accounts/{user_id}/reset-password/ ○ × ×
/api/auth/accounts/{user_id}/offices/ ○ × × 所属事業所を足す
/api/auth/accounts/{user_id}/offices/{office_id}/ ○ × × 所属事業所を外す
/api/users/check-email/ ○ ○ ○ ログイン前でも呼べます(09 の弱点を参照)
/api/tenants/ ○ ○ × クライアントは自分の会社だけ
/api/tenants/{id}/ ○ ○ × 同上
/api/tenants/current/ ○ ○ ○ ログイン前でも呼べます。URL から会社名を出すため
/api/tenants/lookup-corporate-number/ ○ ○ × 国税庁への問い合わせ
/api/tenants/slug-availability/ ○ ○ ○
/api/tenants/{tenant_id}/memos/ ほか ○ × × メモ
/api/tenants/{tenant_id}/alerts/ ほか ○ × × 注意
/api/tenants/{tenant_id}/invoices/ ほか ○ × × 請求書
/api/offices/ ○ ○ ×
/api/offices/{id}/ ○ ○ ×
/api/staff/ ○ ○ × スタッフからは一覧を見せません
/api/staff/{id}/ ○ ○ ×
/api/staff/office-accesses/ ○ ○ × スタッフの事業所への所属
/api/staff/office-accesses/{id}/ ○ ○ ×
/api/staff/invite-links/ ○ ○ ×
/api/staff/invite-links/{id}/ ○ ○ ×
/api/staff/invite/{token}/info/ ○ ○ ○ ログイン前でも呼べます
/api/staff/invite/{token}/check-email/ ○ ○ ○ 同上
/api/staff/invite/{token}/accept/ ○ ○ ○ 同上
/api/shift/jobs/ ○ ○ × スタッフは専用の API を使います
/api/shift/jobs/{id}/ ○ ○ ×
/api/shift/tasks/ ○ ○ ×
/api/shift/tasks/{id}/ ○ ○ ×
/api/shift/applications/ ○ ○ ○ スタッフは自分の応募だけ
/api/shift/applications/{id}/ ○ ○ ○ 同上
/api/shift/attendance/ ○ ○ ×
/api/shift/attendance/{id}/ ○ ○ ×
/api/shift/approvals/ ○ ○ ×
/api/shift/approvals/{id}/ ○ ○ ×
/api/shift/billings/ ○ ○ ×
/api/shift/billings/{id}/ ○ ○ ×
/api/shift/billing/{tenant_id}/{year}/{month}/ ○ ○ ×
/api/shift/billing/{tenant_id}/{year}/{month}/lock/ ○ × × 月次の確定は運営者だけ
/api/shift/client/dashboard/ ○ ○ ×
/api/shift/admin/dashboard/ ○ × ×
/api/shift/reports/jobs/ ○ ○ ×
/api/shift/reports/staff/ ○ ○ ×
/api/shift/staff/jobs/ × × ○ スタッフ専用
/api/shift/staff/jobs/{job_id}/ × × ○ 同上
/api/shift/staff/attendance/today/ × × ○ 同上

スタッフにスタッフ一覧を見せないのは、以前同じ会社の全スタッフの 氏名・電話・住所・口座情報がスタッフから見えていたためです。


追加の操作(@action)

一覧や詳細の読み書きではない操作です。権限の穴が空きやすい場所 なので、1 つずつ書きます。

管理者はすべて使えるため、表では省きます。

操作 API クライアント スタッフ 理由
OfficeViewSet.mine /api/offices/mine/ ○ ○ 自分の所属事業所を引く(読むだけ)
OfficeViewSet.suspend /api/offices/{id}/suspend/ ○ × 事業所の停止は管理の操作
OfficeViewSet.reactivate /api/offices/{id}/reactivate/ ○ × 同上
TenantViewSet.suspend /api/tenants/{id}/suspend/ × × 会社の停止は運営者だけ
TenantViewSet.reactivate /api/tenants/{id}/reactivate/ × × 同上
StaffViewSet.me /api/staff/me/ ○ ○ 自分の情報の参照・更新
StaffViewSet.me_upload_image /api/staff/me/upload-image/ ○ ○ 自分の顔写真
StaffViewSet.upload_image /api/staff/{id}/upload-image/ ○ × 事業所がスタッフの写真を登録する
InviteLinkViewSet.send_email /api/staff/invite-links/{id}/send-email/ ○ × 招待メールの送信
BusinessTaskViewSet.upload_image /api/shift/tasks/{id}/upload-image/ ○ × 業務テンプレートの画像
BusinessTaskViewSet.delete_image /api/shift/tasks/{id}/delete-image/{image_id}/ ○ × 同上
JobViewSet.bulk_confirm /api/shift/jobs/{id}/bulk-confirm/ ○ × マッチングの一括確定
JobViewSet.duplicate /api/shift/jobs/{id}/duplicate/ ○ × お仕事の複製
JobViewSet.match_candidates /api/shift/jobs/{id}/match-candidates/ ○ × マッチングの候補を探す
JobViewSet.send_limited_notification /api/shift/jobs/{id}/send-limited-notification/ ○ × 限定公開の通知
JobViewSet.update_recruitment /api/shift/jobs/{id}/update-recruitment/ ○ × 募集人数の変更
JobViewSet.visibility_scope /api/shift/jobs/{id}/visibility-scope/ ○ × 公開範囲の設定
JobApplicationViewSet.confirm /api/shift/applications/{id}/confirm/ ○ × 採否を決めるのは事業所
JobApplicationViewSet.reject /api/shift/applications/{id}/reject/ ○ × 同上
JobApplicationViewSet.bulk_action /api/shift/applications/bulk-action/ ○ × 一括確定・一括却下
JobApplicationViewSet.withdraw /api/shift/applications/{id}/withdraw/ × ○ 取り下げは応募した本人の操作
AttendanceLogViewSet.clock_in /api/shift/attendance/{id}/clock-in/ ○ ○ 本人の打刻。事業所の代理打刻もあります
AttendanceLogViewSet.clock_out /api/shift/attendance/{id}/clock-out/ ○ ○ 同上
AttendanceLogViewSet.no_show /api/shift/attendance/{id}/no-show/ ○ × 無断欠勤の記録は管理の操作
AttendanceLogViewSet.clear_no_show /api/shift/attendance/{id}/clear-no-show/ ○ × 取り消しも同じ
AttendanceLogViewSet.update_times /api/shift/attendance/{id}/update-times/ ○ × 時刻の手直しは管理の操作
AttendanceApprovalViewSet.approve /api/shift/approvals/approve/ ○ × 勤怠の承認

スタッフが使えない操作を、二重に止めている

上の表でスタッフが × になっている「状態を変える操作」は、 テストで名指しでも止めています。

許可リストだけで守っていると、そこを書き換えたときに静かに穴が開きます。 実際に、応募の一括確定を足したとき判定の分岐に入れ忘れ、 スタッフが自分の応募を自分で確定できる状態になっていました。

新しい操作を足すとき

  1. その操作の権限を書く
  2. スタッフから使ってよいなら、テストの許可リストに理由付きで足す
  3. 状態を変えるなら、名指しの一覧にも足す
  4. この章の表にも足す

「テストが落ちたから許可リストに足す」は禁止です。 先に「その人が本当に使ってよいか」を決めてください。


初回パスワード変更の扱い

発行されたままのパスワードの人は、ほぼすべての API が断られます (password_change_required)。

例外は次の 4 つだけです。これを塞ぐとパスワードを変えられなくなるためです。

API 理由
/api/auth/change-password/ パスワードを変えるため
/api/auth/me/ 自分が誰かを知るため
/api/auth/logout/ やめて出られるようにするため
/api/auth/token/refresh/ 変更の途中でログインが切れないため