二進数とビット演算を活した効率的な権限管理
公開日
2024年12月9日
更新日
2025年1月17日
5
分で読める
TypeScriptJavaScript
権限管理は、管理系アプリケーションの開発において避けられない課題の一つです。
従来の権限管理のアプローチ
一般的に、ユーザーの操作は 読み取り(Read)、作成(Write)、更新(Update)、削除(Delete)の4種類に分類されます。そして、それぞれの操作を表す定数を定義します。例えば:
const READ = 1;
const WRITE = 2;
const UPDATE = 3;
const DELETE = 4;
もしあるユーザーが 読み取り、書き込み、更新の3種類の権限を持っている場合、以下のように表現することができます:
const permission = [READ, WRITE, UPDATE];
この方法は直感的ですが、いくつかの課題があります:
- リソースの消費量増加:配列を使って権限を表現する場合、データベースの保存やネットワークの送受信において、リソースの消費量が増加します。
- 冗長な判定ロジック:例えば、ユーザーが 書き込み 権限を持っているかを確認する場合、
permission.includes(WRITE)を使用します。この書き方は問題ありませんが、コード内で頻繁に同様のロジックが繰り返されると冗長になります。
解決策:二進数とビット演算の活用
これらの課題を解決するために、二進数の表現とビット演算を活用することで、リソース効率を向上させ、ロジックを簡潔にすることができます。
権限の二進数による表現
ユーザーの操作を表す定数を二進数形式で定義します:
const READ = 0b1; // 二進数:0001(10進数:1)
const WRITE = 0b10; // 二進数:0010(10進数:2)
const UPDATE = 0b100; // 二進数:0100(10進数:4)
const DELETE = 0b1000; // 二進数:1000(10進数:8)
この表現では:
- 1桁目が
1の場合は 読み取り 権限を持つことを示します。 - 2桁目が
1の場合は 書き込み 権限を持つことを示します。 - 以降同様です。
権限に対する一般的な操作
1. 権限を付与する
例えば、ユーザーに 読み取り、書き込み、更新の権限を付与する場合は、ビット演算の |(ビットごとの論理和)を使用します:
const permission = READ | WRITE | UPDATE; // 二進数:0111(10進数:7)
console.log(permission); // 出力:7
2. 権限を確認する
特定の権限を持っているか確認する場合は、ビット演算の &(ビットごとの論理積)を使用します:
if (permission & WRITE) {
console.log("ユーザーは書き込み権限を持っています");
} else {
console.log("ユーザーは書き込み権限を持っていません");
}
3. 権限を追加・削除する
権限を追加または削除する場合は、ビット演算の ^(ビットごとの排他的論理和)を使用します:
// 権限にDELETEが含まれていない場合は追加、含まれている場合は削除
const newPermission = permission ^ DELETE;
console.log(newPermission);
この方法のメリット
この方法を採用することで:
- 権限を1つの数値として管理できるため、データベースの保存やネットワークの送受信におけるリソース消費が大幅に削減されます。
- 権限の確認、追加、削除のロジックが簡潔になり、コードがより読みやすくなります。
例えば:
- 権限値が
7の場合、その二進数表現は0111となり、読み取り、書き込み、更新の権限を持っていることを意味します。 - 書き込み 権限を確認するには、単に
permission & WRITEを使用すれば十分です。
結論
二進数とビット演算を活用することで、効率的で優雅な権限管理が実現できます。この方法は、リソースの利用を最適化すると同時に、ロジックを簡潔にするため、管理系アプリケーションに最適な選択肢と言えるでしょう。