功能授權
Entitlement 功能開關
在真正執行受保護功能之前,同時驗證 License 與功能代碼。
這個範例解決什麼問題
當同一套程式需要 Basic、Professional 或選購模組時,Entitlement 用來描述『這張 License 可以使用哪些功能』。它不是單純的 UI 顯示條件,而是每個高價值功能入口都必須重新確認的授權邊界。
適合使用的場景
- 同一個 EXE 需要依 License 等級開放不同匯出、分析或產檔能力。
- 客戶可以另外購買選購功能,而不需要更換整套應用程式。
- 你希望後端撤銷某項功能後,Client 下一次驗證就停止執行該功能。
為什麼採用這種設計
- 只隱藏按鈕很容易被繞過;真正的函式入口仍需呼叫 require_valid() 與 require(feature_code)。
- 功能代碼由 Server 管理,Client 只根據已簽章的驗證結果做決策。
- 把 License 有效性與功能權限分開,可避免『License 有效就代表所有功能都能用』的錯誤假設。
程式實際怎麼執行
同步檢查。has() 只讀目前快照;require() 是核心功能入口的授權邊界,但它也不會自行重新上網。
SDK 自動完成
- 驗證結果把 Entitlement 放入 LicenseState。
- require() 同時檢查 License valid 與功能代碼。
你的程式必須負責
- 先取得足夠新的 state。
- 在核心函式內 require,不只隱藏按鈕。
呼叫時機/頻率
- UI 可在啟動後用 has() 預覽。
- 每次高價值操作前重新驗證再 require。
成功時應看到
- 有功能才執行;缺少時拋 FeatureNotLicensedError。
失敗處理
- 拒絕時停止功能,不退回舊 UI 狀態。
建議整合步驟
- 步驟 1
與管理員確認正式 Entitlement Code,並建立一致的常數名稱。
- 步驟 2
在按鈕事件之外的核心操作函式再次驗證 License 與 Entitlement。
- 步驟 3
對拒絕結果提供清楚的使用者訊息,但不要在 Log 中輸出敏感憑證。
- 步驟 4
針對有權限、無權限、License 過期與離線狀態建立測試案例。
完整程式碼
公開範例使用 Placeholder,重點是理解資料流與 API 行為。正式 Gateway URL、Product UUID、Namespace 與 Public Key 請向授權管理員取得;可直接運行的完整範例由管理員在 Admin SDK 整合中心下載。
"""Protect a real feature boundary, not only a visible UI button."""
from keygen_device_sdk import FeatureNotLicensedError, LicenseSDKError
def export_hdl(client) -> None:
try:
state = client.validate_or_raise()
state.require("YOUR_FEATURE_CODE")
print("Exporting HDL...")
except FeatureNotLicensedError:
print("This License does not include HDL export")
except LicenseSDKError as exc:
print(f"Export blocked: {exc}")
上線前至少測試
- 有/無權限。
- 直接呼叫核心函式。
- 運行中撤銷。
常見錯誤
- 不要只在程式啟動時檢查一次。
- 不要只用前端 UI disabled 狀態保護功能。
- 不要讓使用者輸入任意 Entitlement Code 再交給核心功能。