私は承認サービスを設計しています。ユーザーに割り当てられたロールとコンテンツに設定された権限に基づいてアクセス制御を実行します。ユーザーは複数のグループに所属できます。これらのグループは、他のグループにも属することができます。グループの下のグループの下のグループの深さはそれほど大きくありません。コンテンツは、ユーザー レベルまたはグループ レベルで共有できます。コンテンツは複数のグループと共有することもできます。コンテンツで許可されている操作はto-read
またはto-read-write
です。
上記の問題に対するソリューションの設計に関する私の考えは次のとおりです。事は、それは非常に単純に見えるということです。設計のパフォーマンスやスケーラビリティに影響を与えるいくつかの点が欠けているのではないかと心配しています。これがデザインです。
データ ストア:
各ユーザーは複数のロールを持つことができます。ロールは文字列で、名前空間のように見えます。supergroup.group.subgroup.rolename
. 各コンテンツは複数の権限を持つことができます。アクセス許可は文字列であり、名前空間のように操作タイプのプレフィックスが付いています。canreadwrite.supergroup.group.subgroup.rolename
承認アルゴリズム 承認関数のアルゴリズムは次のようになります (PS これは基本を示すためのものです。実際には、役割とアクセス許可の配列が並べ替えられ、このマッチングを行うために何らかの形式のバイナリ検索が使用されます)
public bool CanReadWrite(string[] roles, string[] permissions)
{
foreach (var role in roles)
{
foreach (var permission in permissions.Where(s => s.StartsWith(canreadwrite)))
{
string barePermission = permission.Remove(0, canreadwrite.Length);
if (role.StartsWith(barePermission))
{
return true;
}
}
}
return false;
}
このデザインに問題はありますか? パフォーマンスの問題はありますか?スケーラビリティの問題?