【发布时间】:2012-11-18 23:22:18
【问题描述】:
检索用户有权访问的所有资源列表的推荐方法是什么?
在我见过的许多示例中,授权被放置在一个单独的服务中——通常一个公开类似于 isAuthorized() 的方法,该方法可用于单个查询(“用户是否有权使用资源 ABC? ") 以及批量查询(“用户是否有权使用以下任何资源列表?”)。
虽然授权逻辑存在于授权服务中,但授权策略的执行保留在应用程序本身中(例如,用于实际实施的业务逻辑层根据授权服务的结果访问资源;或表示层根据授权服务的结果显示/隐藏各个选项等)。
例如,如果我的数据访问层有可能返回的数十亿“资源”,那么执行此操作的首选方法是什么?我的业务逻辑层是否查询所有数据(通过网络传递所有数据),然后将该巨大列表转发到授权服务(再次通过网络),只得到一个巨大的“允许/拒绝”列表发回业务逻辑?显然这听起来不太对。
在这种情况下,我们不能对数据访问、授权逻辑和业务逻辑进行“干净”分离吗?我是否应该要求我的数据访问层只向我返回用户有权访问的所有资源的列表,这最终可能被实现为简单的数据库连接,但随后需要一些用于确定谁的逻辑可以在什么条件下访问哪些资源(即授权策略)嵌入数据访问代码中,因此这些策略将分布在我的代码库中(例如,某些授权逻辑将在我的数据访问中层,有些会在我的授权层等)?
也许性能胜过“干净”的架构,但有更好的方法吗?
【问题讨论】:
-
我正在开发一个大型遗留应用程序,我面临着类似的难题。 “大型结果集”场景很棘手,我绝对不认为这不是 sJhonny 暗示的问题。虽然 所有 记录的结果集可能不是一个好的设计,但如果您想提供记录数或页数,您仍然会遇到问题(而一个好的设计会我>)。如果您的数据层是基于不同的技术(例如 SQL 存储过程)构建的,这将变得更加困难。即使您承认重复您的授权逻辑,它也是一种不同的语言!
标签: service architecture authorization