権限セット
アプリケーション、オブジェクト、フィールド、システムの権限を付与します。
権限セットは、機能を付与する主な方法です。ユーザーに直接、またはポジションを通じて間接的に割り当てられます。割り当ては valid_from / valid_until の期間を持てます。期限切れの付与は即座に解決されなくなります。
権限セットが制御するもの
| 権限の種類 | 例 |
|---|---|
| アプリケーションへのアクセス | ユーザーが CRM や Setup を開ける |
| オブジェクトの権限 | レコードを作成、読み取り、更新、削除する |
| フィールドの権限 | 選んだフィールドを読み取る、または更新する |
| システムの権限 | Setup にアクセスする、レポートを実行する、監査ログを表示する |
| 連携の権限 | API キー、Webhook、管理アクションを使う |
オブジェクトの権限
オブジェクトの権限は次の問いに答えます。
Can this user perform this operation on this object at all?権限セットの付与は、次のフラグの名前を使います(セキュリティプラグインの権限評価器が強制するとおりです)。
| フラグ | 意味 |
|---|---|
allowRead | レコードアクセスのルールが許すレコードを読み取ります |
allowCreate | レコードを作成します |
allowEdit | レコードアクセスのルールが許すレコードを更新します |
allowDelete | レコードアクセスのルールが許すレコードを削除します |
allowExport | オブジェクトのレコードの、機械可読な一括コピーを取ります |
viewAllRecords | レコードアクセスをすり抜けて、そのオブジェクトのすべてのレコードを読み取ります |
modifyAllRecords | レコードアクセスをすり抜けて、そのオブジェクトのすべてのレコードを更新または削除します。読み取りについては viewAllRecords を含意します |
viewAllRecords または modifyAllRecords が通常の行レベルの境界をすり抜けない限り、レコードアクセスは引き続き重要です。これらのフラグは管理用の権限セットのために取っておいてください。事実上、そのオブジェクトについてのテナント全体のスーパーユーザーの付与です。
エクスポートは独立した付与
エクスポートはシステムの権限ではなくオブジェクトの権限であり、オプトインです。
allowExport | 結果 |
|---|---|
| 未設定 | エクスポートは拒否 |
false | 拒否 |
true | 許可(引き続き allowRead の範囲内) |
以前は、未設定は「読み取りを継承する」を意味していました。ObjectStack 17.0 以降は拒否を意味し、viewAllRecords / modifyAllRecords もそれを与えなくなりました。「すべてのデータを見てよい」と「その一括コピーを取ってよい」は、意図的に別の付与になっています。
// Keys of a permission set; its other keys are omitted.
objects: {
deal: { allowRead: true, allowExport: true }, // ← add the grant
}計画しておくべき 3 つの結果:
- この付与を持つ提供済みのセットはなく、それを取り去るのはアップグレードです。 パッケージで提供されるセットはアップグレード時に再投入され、ObjectStack 17.1 以降、
admin_full_access、organization_admin、そこから派生したorganization_admin_no_bypassは、ワイルドカード*でエクスポートを付与しなくなりました。自動的な代替は意図的に用意されていません。エクスポートは、アプリ自身の権限セットの中で、オブジェクトごとに付与されます。管理者によるエクスポートを意図するところでは、自分で作成するセットでallowExportを明示的に付与してください。環境で作成されたセットも、これを持ったことはありません。ユーザーがエクスポートするカスタムのセットはすべて編集してください。パースの時点では何も失敗しないので、何も編集しないアップグレードは有効なメタデータのままで、その管理者は、どのアプリのセットも指定していないすべてのオブジェクトで、気づかないうちにエクスポートを失っています。 member_defaultは意図的にこの付与を持ちません。そのため一般の認証済みユーザーは、管理者が付与するまでエクスポートを失います。それがこの切り替えの目的であって、見落としではありません。allowExportを持つセットは高権限です。そのためeveryoneやguestの対象者のアンカーにバインドすることはできません。そうでなければ、エクスポートできるセットを匿名のアンカーにバインドすることで、オプトインを無効にできてしまいます。
マージは CRUD のビットとまったく同じく、最も許容的なものが採用されます。割り当てられたセットのどれかが true を付与していればエクスポートが付与され、false と未設定は同じ結果になります。レポートも同じ軸で扱われます。
システムの権限
システムの権限は、次のようなプラットフォームの操作のためのものです。
- Setup へのアクセス
- ユーザーの管理
- ポジションと権限セットの管理
- レポートの実行
- 連携の管理
- 監査ログの表示
管理者が簡単に監査できるように、システムの権限は業務オブジェクトの権限と分けておいてください。
推奨されるセット
名前付きのいくつかの権限セットから始めます。
| 権限セット | 目的 |
|---|---|
| Basic User | ログインし、メインのアプリケーションにアクセスする |
| Setup Administrator | ユーザー、ロール、設定、診断を管理する |
| Report Viewer | レポートとダッシュボードを表示する |
| Integration Operator | Webhook / API キーを管理する |
| Support User | サポートのオブジェクトを読み取る / 更新する |
その後、顧客のアプリケーションのためのドメイン固有のセットを追加します。
セットに isDefault を付けると、そのセットを所有するパッケージがインストールされたときに、割り当ての候補として提案されます(13 より前の isProfile フラグを置き換えるものです)。
権限セットを無効にする
権限セットの Deactivate アクションは、その付与を即座に止めます(ObjectStack 17.1)。無効化されたセットは、ユーザーに直接届く場合もポジションを通じて届く場合も、オブジェクト、フィールド、システム、タブの権限を何も与えず、本来与えるはずの管理者としての立場も与えません。active の値が空のセットは影響を受けません。数えられるのは明示的な無効化だけです。
2 つの結果:
- これで全員を締め出すことはできません。 管理者を管理者たらしめているセットを無効にしようとすると、それを削除しようとしたときと同じ「最後の管理者」のガードによって拒否されます。
- 17.1 を越えるアップグレードは取り消しです。 17.1 より前はこのスイッチは何もしておらず、無効化されたセットも付与を続けていました。アップグレードの前に、無効化されたセットとポジションを一覧し、まだ付与を続けるべきものを再び有効にしてください。ポジションを無効にするを参照してください。
委任された管理
権限セットは、その保持者をスコープ付きの管理者にする adminScope を持てます。スコープは次のものを宣言します。
- 委任者がどこで操作できるか:事業単位のサブツリー
- 何をできるか:
manageAssignments、manageBindings、authorEnvironmentSets - どの権限セットを配布できるか(
assignablePermissionSets)
委任者は、許可リストにあるセットに対してだけ単一の行を書き込み、すべての付与には監査のために granted_by が記録されます。それ自体が adminScope を持つセットを付与または作成するには、付与する側が、それを厳密に包含するスコープを持っている必要があります。テナントレベルの管理者は、このゲートを完全にすり抜けます。
フィールドのセキュリティ(付録)
権限セットはフィールドレベルの付与も持ちます。ユーザーがレコードを読める場合でも、個々のフィールドを隠したり、読み取り専用にしたりできます。
2 つのモード
| モード | 効果 |
|---|---|
| 非表示 | フィールドは API のレスポンスと生成されたビューから完全に取り除かれます |
| 読み取り専用 | フィールドは返されますが、書き込みは拒否されます |
3 つ目の状態であるマスク(138****5678)は、権限セットのモードではありません。フィールドに宣言されるもので、権限セットが決めるのは、マスクを外す機能を誰が持つかだけです。Field-Level Security を参照してください。
どこで強制されるか
オブジェクトの権限をチェックするのと同じ評価器が、REST、ObjectQL、生成されたフォーム、エクスポートのすべての経路でフィールドのルールを適用します。下位レベルの API を通る「裏口」はありません。
典型的なパターン
| ユースケース | 推奨 |
|---|---|
sys_user の人事データ(給与、社会保障番号) | HR 権限セット以外の全員から隠す |
| 外部システムの識別子 | サポートには読み取り専用、連携の運用者には書き込み可能 |
product の社内コストと顧客価格 | cost を営業から隠し、財務には表示する |
| 保護対象の医療情報を含むメモのフィールド | 権限セットが該当する臨床上のロールを含まない限り隠す |
作成のガイダンス
- フィールドが機密性の高いデータを持つ場合は、読み取り専用ではなく非表示をデフォルトにします。読み取り専用でも、値はレスポンスとログに漏れます。
- フィールドの権限のキーは、常にオブジェクトで修飾して書きます(
budgetではなくcrm_lead.budget)。ObjectStack 14.4 以降、security-fls-unqualified-keyの lint はコンパイル時に素のキーを拒否します。それらは黙って何にも一致していなかったからです。 - フィールドごとに 1 つのセットを作るのではなく、実際の職務(
HR Manager、Finance Read-only)に合った権限セットにフィールドのルールをまとめます。監査が簡単になります。 - コンプライアンスのユースケースでは、フィールドのセキュリティと監査ログの保持を組み合わせ、後から「誰がこの行を見たか?」に答えられるようにします。