我正在设计授权服务。它根据分配给用户的角色和对内容设置的权限执行访问控制。用户可以属于多个组。这些组也可以属于其他组。组下组下组的深度并没有那么大。内容可以在用户级别或组级别共享。内容也可以与多个组共享。内容上允许的操作是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;
}
你觉得这个设计有什么问题吗?有性能问题吗?可扩展性问题?