检索用户有权访问的所有资源列表的推荐方法是什么?
在我见过的许多示例中,授权被放置在一个单独的服务中——通常一个公开类似于 isAuthorized() 的方法,该方法可用于单个查询(“用户是否有权使用资源 ABC?”)作为以及批量查询(“用户是否有权使用以下任何资源列表?”)。
虽然授权逻辑存在于授权服务中,但授权策略的实施保留在应用程序本身内(例如,根据授权服务的结果实际实现对资源的访问的业务逻辑层;或表示层以根据授权服务等的结果显示/隐藏各个选项)。
例如,如果我的数据访问层有可能返回的数十亿“资源”,那么首选的方法是什么?我的业务逻辑层是否查询所有数据(通过网络传递所有数据),然后将该巨大列表转发到授权服务(再次通过网络),只得到一个巨大的“允许/拒绝”列表发回业务逻辑?显然这听起来不太对劲。
这是我们不能“干净”分离数据访问、授权逻辑和业务逻辑的情况吗?我是否应该要求我的数据访问层只向我返回用户有权访问的所有资源的列表,这最终可能被实现为简单的数据库连接,但随后需要一些用于确定谁的逻辑可以在什么条件下访问哪些资源(即授权策略)嵌入数据访问代码中,因此这些策略将分布在我的代码库中(例如,某些授权逻辑将在我的数据访问中层,有些会在我的授权层等)?
也许性能胜过“干净”的架构,但有没有更好的方法呢?