ビットマスクによるパーミッションフラグ
ビットマスクフラグを使用してUnixスタイルのパーミッションシステムを実装。パーミッションの定義、結合、チェック、付与、取消をビット演算で学びます。
Practical Applications
詳細な説明
ビットマスクを使用したパーミッションシステム
Unixファイルパーミッションはビットマスクベースのアクセス制御の古典的な例です。各パーミッションタイプは個別のビット位置を占めます:
const NONE = 0b000; // 0
const EXECUTE = 0b001; // 1
const WRITE = 0b010; // 2
const READ = 0b100; // 4
パーミッションの付与(OR)
ORでパーミッションを結合:
const readWrite = READ | WRITE; // 0b110 = 6
const all = READ | WRITE | EXECUTE; // 0b111 = 7
パーミッションのチェック(AND)
特定のパーミッションが付与されているかテスト:
function hasPermission(flags, permission) {
return (flags & permission) === permission;
}
hasPermission(readWrite, READ); // true
hasPermission(readWrite, EXECUTE); // false
パーミッションの取消(AND + NOT)
他に影響を与えずにパーミッションを削除:
function revoke(flags, permission) {
return flags & ~permission;
}
revoke(readWrite, WRITE); // 0b100 = READのみ
多段階パーミッション
Unixはこれを所有者/グループ/その他に各3ビット(合計9ビット)で拡張:
Owner Group Other
rwx rwx rwx
111 101 101 = 0o755 = 0b111101101
ロールベースの拡張
最新のシステムはこのパターンを数十のパーミッションタイプに拡張:
const PERM = {
VIEW: 1 << 0, // 1
EDIT: 1 << 1, // 2
DELETE: 1 << 2, // 4
SHARE: 1 << 3, // 8
ADMIN: 1 << 4, // 16
EXPORT: 1 << 5, // 32
};
const editorRole = PERM.VIEW | PERM.EDIT | PERM.SHARE; // 11
const adminRole = 0b111111; // 全パーミッション = 63
32ビット整数で32の個別パーミッションフラグを保持でき、ほとんどのアプリケーションに十分です。
ユースケース
Webアプリケーションフレームワークはロールベースアクセス制御(RBAC)にビットマスクパーミッションを使用します。例えばDiscordは53ビット整数を使用してチャネルパーミッションオーバーライドを格納します。各ビットがSEND_MESSAGES、MANAGE_CHANNELS、BAN_MEMBERSなどのパーミッションを表します。パーミッションチェックはシンプルなAND演算で、パーミッションオーバーライドはロールパーミッションをORで結合してからチャネル固有の許可/拒否マスクを適用して計算されます。