ビットマスクによるパーミッションフラグ

ビットマスクフラグを使用して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で結合してからチャネル固有の許可/拒否マスクを適用して計算されます。

試してみる — Bitwise Calculator

フルツールを開く