我对灵活、合理粒度的安全系统有广泛的要求,允许我们自定义允许给定角色或用户在系统中执行的操作。
面对这个要求,我必须选择架构中的哪些对象、类或项目安全性应该用作其构建块——例如。如果我们授予一个角色访问 X 的权限,那么 X 是什么?实体、控制器操作、自定义对象列表中的项目等。
我正在考虑的选项:
1)通过对实体的 CRUD 操作授予(例如,可以授予用户对帐户实体的创建/读取/更新访问权限,以及对发票实体的读取访问权限等)
2)通过对实体的 CRUD 操作授予,对单个实体属性的 RU 操作(例如,访问更新特定字段) - 可以通过实体上的属性标识的“属性组”来简化
3)由存储库和存储库功能授予(例如,允许调用 AccountsRepository.Get(...) 或 AccountsRepository.GetList(...) 等)
4)由 MVC 控制器授权 + 操作(例如,允许访问 /Accounts/Index 或 /Accounts/Update/X 等)
5)通过“安全对象”的自定义列表授予,该列表可以绑定到架构中的任意事物
选项 (5) 提供了最大的灵活性但最不通用的实现。选项 (4) 很有吸引力,因为安全项目将密切反映用户界面,但这意味着域不保护访问,并且安全不会应用于非 Web 界面。
您对在 MVC + DDD + Repository 模式中设计安全模式有什么看法和经验?