我正在为不断增长的系统开发 REST API。一般来说,角色/声明访问控制就像这样完美地工作。
[HttpGet]
[Route("settings")]
[Authorization(Type = AuthorizationType.Admin, Permission = Permission.StoreSettings)]
public IHttpActionResult GetSettings() { /*...*/ }
例如,当我的用户可以更深入地控制访问权限时,就会出现问题,如下图所示。这是系统的一个抽象示例。
如果我需要查询某个区域中的某些内容,这很简单,但是当我需要从中获取所有内容时Items
,Departments
我必须编写相同的丑陋代码,我无法真正重用。不是真正的代码,但看起来像这样。
Db.Items.Where(i =>
i.Stores.Any(s => s.CityId == User.CityId) &&
Db.UserDepartmentRights.Any(udr => udr.UserId == User.UserId && i.DepartmentId == udr.DepartmentId));
它显然很难看而且很难维护,尤其是当我需要在系统中引入另一个级别时。
是否有任何框架可以处理这个问题或我可以实现的正式架构?