二進数とビット演算を活した効率的な権限管理

公開日 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];

この方法は直感的ですが、いくつかの課題があります:

  1. リソースの消費量増加:配列を使って権限を表現する場合、データベースの保存やネットワークの送受信において、リソースの消費量が増加します。
  2. 冗長な判定ロジック:例えば、ユーザーが 書き込み 権限を持っているかを確認する場合、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 を使用すれば十分です。

結論

二進数とビット演算を活用することで、効率的で優雅な権限管理が実現できます。この方法は、リソースの利用を最適化すると同時に、ロジックを簡潔にするため、管理系アプリケーションに最適な選択肢と言えるでしょう。

概要

技術的洞察、経験、思考を共有する個人ブログ

クイックリンク

お問い合わせ

  • Email: hushukang_blog@proton.me
  • GitHub

© 2025 CODE赤兎. 無断転載禁止