在许多示例中,授权被放置在单独的服务中 - 通常是暴露类似于isAuthorized()的方法,该方法可用于单个查询(“用户是否有权使用Resource ABC?”)以及批量查询(“用户是否有权使用以下资源列表中的任何一个?”)。
虽然授权逻辑存在于授权服务中,但授权策略的执行保留在应用程序本身内(例如,基于来自授权服务的结果实际实现对资源的访问的业务逻辑层;或者基于来自授权服务的结果显示/隐藏个别选项的表示层等)。
如果我的数据访问层可能返回数十亿个“资源”,那么最佳方法是什么?业务逻辑层是否查询所有这些数据(通过网络传输所有这些数据),然后将该巨大列表转发到授权服务(再次通过网络),只是为了获得一个巨大的“允许/拒绝”列表发送回业务逻辑?显然,这听起来不太正确。
这是一种情况,我们无法拥有“干净”的数据访问,授权逻辑和业务逻辑分离吗?我应该要求我的数据访问层仅向我返回用户可以访问的所有资源列表,这可能会被实现为简单的数据库连接,但这将要求嵌入到数据访问代码中以确定谁有权访问什么资源在什么条件下(即,授权策略),因此这些策略将分散在我的代码库中(例如,一些授权逻辑将在我的数据访问层中,一些将在我的授权层中等)?
也许性能胜过“干净”的架构,但是否有更好的方法来解决这个问题?