ccairn

權限與角色

每個 token 屬於一個使用者,使用者有一個角色;角色決定你能呼叫哪些端點、看得到誰的資料。

本篇說明角色與其典型範圍、權限字串怎麼對應到端點、為何業務只看得到自己的訂單,以及哪些功能受模組與自訂角色控制。

角色總覽

cairn 內建六種角色。admin / sales / op / accountant 是後台員工角色,customer 是顧客,guide 是嚮導受限登入。

角色典型範圍
admin全功能 + 使用者與角色管理
sales自己經手的訂單與客戶、同業、行程內容
op出團作業、線控(梯次、排班、備辦、裝備、審核裁決)
accountant財務(收款、請款核簽、退款核准、內外帳、損益、對帳)
customer只看自己的訂單與個人資料
guide受限登入:只進嚮導 portal、登記自己帶團的成本
說明

只有 salesadmin 可被指派為訂單的負責人。guide 是受限登入,不能進後台或管理其他使用者;customer 只能操作自己的資料。

權限字串如何對應端點

每個端點都要求一個 權限字串,格式是 resource.action(資源 + 動作)。API 參考逐端點標了它要求的權限——你的角色被授予該權限,才呼叫得動。

權限允許的動作範例端點
order.read讀訂單GET /orders
order.create建訂單POST /orders
order.adjust掛帳 / 折讓 / 加收 / 沖正訂單應收調整
trip.manage建 / 編 / 刪行程與梯次trips
payable.approve核准請款payment-requests
refund.approve核准退款/orders/{id}/refunds
ledger.read看內外帳 / 淨利internal-external-ledger

一個資源的不同動作可分別授權:例如 oporder.read / order.update / order.adjust,但沒有 order.createaccountant 只有 order.read讀與寫分開——能看不代表能改。

呼叫端點時,伺服器依你 token 的角色檢查所需權限;不足即回 403 forbidden

Owner-scope:只看自己的

部分端點除了權限檢查,還會依 token 的使用者自動限縮可見範圍。最典型的是訂單:

  • salesorder.read,但只看得到自己經手的訂單。
  • customer 只看得到自己名下的訂單與個人資料。

範圍由伺服器依 token 的使用者重新判定,不接受用參數覆寫。落在範圍外的資源,對你而言形同不存在——查詢列表時不會出現,直接取用會回 404 not_found(而非 403,避免洩漏存在性)。

注意

不要用 owner-scope 當唯一授權假設。admin / op / accountant 等管理角色看得到全部訂單;owner-scope 是業務心理隔離的範圍限縮,不是逐租戶隔離(租戶隔離由網域天然完成,見總覽)。

模組閘

部分進階功能屬可選模組,租戶可能未啟用。即使你的角色有對應權限,模組關閉時相關端點仍會回 403 module_disabled

模組涵蓋
訂房(lodging)住宿庫存與直訂
進階會計(accounting)內外帳、損益、結算
登山(climbing)登山審核、裝備
海外(overseas)海外團
抽籤(lottery)名額抽籤

模組閘先於權限檢查:先確認租戶啟用了模組,再看你的角色有沒有權限。

兩個 403 要分開處理:module_disabled 代表「整個功能未開通」(要租戶在設定啟用模組),forbidden 代表「你這個角色沒權限」(要換有權限的 token 或調整角色)。

自訂角色

除了六個內建角色,admin 可以建立自訂角色,用「資源 × 動作」矩陣勾選要授予哪些 resource.action

  • 自訂角色只能引用既有的權限——權限目錄由平台定義,你無法憑空造出新的 resource.action
  • 內建六角色唯讀:可檢視其權限矩陣,但不能改名或刪除。
  • 編輯角色權限本身需要 role.manage 權限(僅 admin)。

透過 roles API 可列出角色(內建 + 自訂)並讀取單一角色的完整權限矩陣;指派使用者角色與建立員工帳號走 staff API

提示

要查「某個 token 為何被擋」,先看 API 參考該端點標的權限字串,再用 roles API 對照該使用者角色的權限矩陣有沒有那一格;若端點屬模組功能,也確認租戶啟用了該模組。

下一步

Command Palette

Search for a command to run...