役割とアクセスによるインタフェース
1)原則
1.セキュリティ=UXタスク。ユーザーは「灰色の領域」がなければ何ができるか、何ができないかを明確に理解しなければなりません。
2.必要最小限の権利。ディスプレイからアクションまで、すべてがロールタスクに限定されています。
3.信号禁止の代わりに。アクセスがない場合は、その理由と取得方法(リクエスト、申請、トレーニング)を説明します。
4.サーバー上での重複。UIガードはサーバーチェックを置き換えることはありません。
5.透明な監査。各敏感な行為は読みやすい印を残します。
2)アクセス制御モデル
RBAC(ロールベース):固定ロール:プレーヤー、サポート、ファイナンス、リスク/コンプライアンス、アフィリエイトマネージャー、モデレーター、管理者。
ABAC(属性ベース):属性ベースのポリシー(管轄、ブランド、タイムゾーン、VIPレベル、チーム、シフト)。
ReBAC(リレーションシップベース):リレーションシップ(プレイヤーハンドラー、チケットホルダー、パートナーマネージャー)によるアクセス。
SoD(職務の分離)-重要なタスクの分離(作成≠承認)。
練習:基礎としてRBAC、微調整のためのABAC(ブランド/地域)、財政/限界のためのSoD、 ReBAC-ポイント(キュレーションされたポートフォリオ)。
3)役割別機能マップ(iGaming例)
4)権利と役割のUXパターン
4.1ナビゲーションと可視性
ナビゲーション(ノイズ低減)からアクセスできないセクションを非表示にしますが、可能性を理解するのに役立ちます。
一時的に利用できない場合-「ロック」ヒント:理由、要件、CTA「リクエストアクセス」。
4.2行動の状態
無効+ツールチップ:"ファイナンスの役割が必要です。アクセスをリクエストします。
読み取り専用モード:fields "under the glass'、明示的なマーカー"Read-only"。
エスカレーション-[Apply]ではなく[Submit for Approval]をクリックします。
4.3マスキングと編集
PII(電子メール、電話、住所)-'user@'、'+380 90'他の人のレコードのために。
PAN/IBAN-トークンのみ/最後の4。
[完全なラジオボタンを表示]-ロールの所有のみ/監査イベントによる。
5) UIのパーミッションアーキテクチャ
クライアントのポリシーコンテキスト:パーミッションキャッシュ(TTL短い)+更新のサブスクリプション。
ルートガード:アクセスできないルート→403ページの説明とCTA。
コンポーネントガード:'Can ({action:' approve_in'、リソース:'payout'})'。
Ficheflags:実験的/季節的なもの-権利とは別。
tsx type Permission = string; // 'payout.approve', 'kyc.view_masked'
type Policy = { has:(p:Permission)=>boolean };
const PolicyCtx = React.createContext<Policy>({ has:()=>false });
export const Can: React.FC<{perm:Permission, children:React.ReactNode, fallback?:React.ReactNode}>
= ({perm, children, fallback=null}) => {
const { has } = React.useContext(PolicyCtx);
return has(perm)? <>{children}</>: <>{fallback}</>;
};
6)サーバー>クライアント
任意のアクションは、マーク(ロール、属性)を持つトークンによってサーバーによって確認されます。
ポリシーは一元化されています(PDP/OPA/Cedar/Zanzibar-like)。
すべての重要な操作-2要素確認+監査。
7)マスキングおよび赤いデータゾーン
データカテゴリ:- PII:名前、電子メール、電話、住所、生年月日。
- ファイナンス:PAN/IBAN/暗号財布、金額、限度額、ボーナス残高。
- 書類:パスポート/ID/selfies (KYC)。
- ゲーム:賭けの歴史/賞金/パターン。
- フル所有のロール/レコードオーナー。
- マスク-サポート、金融(所有者ではない)。
- 集計-分析(IDなし)。
tsx function Redact({text, perm}:{text:string, perm:Permission}){
const { has } = React.useContext(PolicyCtx);
return <span>{has(perm)? text: text.replace(/.(?=.{4})/g,'•')}</span>;
}
8)承認とSoDフロー
4つの目:イニシエータ≠承認者。
マルチステージルート(たとえば、金額>X→2行目)。
アプリケーションの有効性、SLA、エスカレーション。
マガジン:誰が作成しました、誰が変更しました、誰が承認しました、いつ、どこから。
例:撤退の確認、選手制限の変更、KYCの評決、制裁フラグの削除。
9) iGamingの詳細
制限と自己除外:SoDと必須のユーザー通知でのみ変更します。
KYC/AML:ドキュメントアクセス-狭い役割;サムネイルのプレビュー、フルサイズ-ログと別のアクションで。
制裁/RAPフラグ:リスクチームに表示されます。サポート-ステータスのみ「確認が必要」。
支払い/アウトプット:ポスト/拒否-財務会計の役割のみ;しきい値以上の金額-二重確認。
ベッティングログ:サポートは読み取りますが、編集は行いません。調整-調査と別の関数。
10)ローカライズ、A11y、 RTL
「no access」テキストはローカライズされ、有効なパス(アプリケーション/トレーニング)が含まれています。
フォーカスコントロール:説明なしでユーザーを「空白」ページに転送しないでください。
RTLモードは、各リージョンのロールでサポートされています。
A11y: 'aria-disabled'+説明、キーボードのエスカレーションの可用性。
11)条件とエラー
403(対象外):ロールコンテキストと「リクエストアクセス」CTAを持つフレンドリーなページ。
404(リソースなし):隠されたオブジェクトの存在を明らかにしないでください。
413/422(あまりにも多く/検証):ポリシーの詳細を漏らさないでください、中立的に定式化します。
Rate-limits/locks:タイマー/ロック解除条件を説明します。
12)メトリクス
アクセス拒否レート:ロール/画面による障害レート(IAまたはポリシー信号の不良)。
承認SLA:フローによる承認時間の中央値(出力、制限、KYC)。
Mask Reveal Events: PIIの「Reveal」率(小さいと正当化されると予想される)。
エラー解決:403から付与されたアクセスまでの時間。
Lost-Privilege Drift:冗長な権利を持つ役割(使用による検出可能性)。
13)アンチパターン
「何も起こっていない」の下にエラーを隠します。
説明のない空のボタンを表示します。
所有者を自分のデータでマスクします。
サーバーポリシーなしでUIガードに依存します。
ficheflagsとアクセス(異なるタスク)をミックスします。
便宜のためにサポート「神モード」を与えます。
14)システムトークンの設計(例)
json
{
"access": {
"badge": { "viewer":"#607D8B", "editor":"#4CAF50", "approver":"#FF9800", "admin":"#9C27B0" },
"lockColor": "#9E9E9E",
"maskChar": "•"
},
"states": {
"noAccess": { "bg":"var(--bg-elev)", "border":"var(--border)", "icon":"#9E9E9E" },
"approval": { "pending":"#FFC107", "approved":"#4CAF50", "rejected":"#F44336" }
},
"a11y": { "ariaDisabled": true, "explainDenial": true }
}
15)スニペットUI
ルートガード:tsx import { Navigate, Outlet } from 'react-router-dom';
function GuardedRoute({perm}:{perm:Permission}){
const { has } = React.useContext(PolicyCtx);
if (has(perm)) return <Outlet/>;
return <Navigate to={`/403?perm=${encodeURIComponent(perm)}`} replace/>;
}
CTAが付いているアクセスカード無し:
html
<article class="no-access">
<h3>Недостаточно прав</h3>
<p>Доступ к разделу «Выплаты» доступен ролям: Финансы/Админ.</p>
<button class="btn" data-open-request>Запросить доступ</button>
</article>
監査ログ(略称):
json
{
"ts": "2025-11-03T18:45:12Z",
"actor": "u_5412",
"action": "payout.approve",
"target": "withdraw#w_91822",
"ip": "194...12",
"result": "success"
}
16) QAチェックリスト
ナビゲーションとIA
- 利用できないセクションはメニューにノイズを発生させません。
- CTAで明確な「アクセス不可」ページ/カードがあります。
アクションとガード
- 権利のないボタン-'disabled'+tooltip/text。
- 保護されたルート;ダイレクトURL→403説明付き。
- サーバーは各アクションを確認します。
データ
- PII/PAN/KYCはポリシーによってマスクされます。
- 「開示」のログを作成し、レビューします。
- エクスポート/レポートはロール(分析の集計)に対応します。
SoD/承認
- イニシエータは彼のアプリケーションを承認することはできません。
- しきい値の量→マルチステージルート。
А11у/Localization
- 「No access」がローカライズされています。キーボードナビゲーションが動作します。
- コントラスト/フォーカスリングはAAに対応しています。
信頼性について
- 短いTTLでパーミッションキャッシュ;役割を変えるとき障害。
- PDPドロップ→UIはデフォルトセーフモードです。
17)設計システムにおけるドキュメンテーション
-'GuardedRoute'、 'Can'、 'NoAccessCard'、 'ApprovalBanner'、 'Redact'。
ポリシー:ロール/アクションマトリックス、SoDルール、マスキングレベル。
プロセス:アクセスの要求、役割の訓練/証明、権利の改訂はN週に一度。
Do/Don 't gallery:「理由のない空のボタン」「、所有者に変装する」「、サーバーチェックのないUI」と「制限とCTAの説明」。
簡単な要約
ロールインターフェイスは、明確な情報アーキテクチャ+厳格なポリシー+フレンドリーな説明です。必要なものだけを表示し、機密データをマスクし、ルートと行動を警備員と保護し、監査のすべての重要なイベントを記録し、お金とコンプライアンスに影響を与える責任を共有します。iGamingでは、これはリスクを軽減するだけでなく、チームをより迅速かつ穏やかにします。