12

我正在为此查看 Spring-security 3.0,spring 的 ACL 过滤发生在 post(api call) 操作中。有两个问题:-

  1. 它会破坏分页查询
  2. 即使我在 api 获取结果上方的层上进行分页(我在这里使用 spring-hibernate),每次 db 查询都是浪费的,因为它会获取并填充所有结果,即使它们中的大多数注定要在 java 中被过滤掉等级

我已经看到解决方案,其中每个查询都附加了在数据库级别进行过滤的 acl 查询,但这看起来很丑陋,因为它污染了具有授权问题的业务逻辑,是否有任何方法/框架可以透明地进行数据库级别的 acl 过滤?我喜欢 spring-securities 通过配置/注释以声明方式强制执行安全性的整体方法,从而直接将代码从安全相关逻辑中解放出来,但我认为它在性能问题上失去了这一点

4

1 回答 1

2

对于你提到的问题,只有#1 对我来说才是真正的问题。

对于 #2 问题,如果我理解正确,它是返回结果列表而没有任何分页行为的查询。因此,假设结果的大小是有限的,并且不会增长到返回结果将变得非常缓慢的程度。否则,您需要将此查询设置为可分页并返回到 #1 问题。鉴于有限的结果列表,我怀疑应用程序级别的过滤使用@PostFilter将明显慢于数据库级别的过滤。

我已经看到解决方案,其中每个查询都附加了在数据库级别进行过滤的 acl 查询,但这看起来很丑陋,因为它污染了具有授权问题的业务逻辑,是否有任何方法/框架可以透明地进行数据库级别的 acl 过滤?我喜欢 spring-securities 通过配置/注释以声明方式强制执行安全性的整体方法,从而直接将代码从安全相关逻辑中解放出来,

因此,对于#1 问题,如果您使用的是 Hibernate,您可以查看@Filter哪个允许您以声明方式定义 where 子句,该子句将在查询特定实体时附加到 select SQL 中。默认情况下,过滤器是关闭的,需要在每个事务中启用。where 子句也可以参数化。

这意味着您可以简单地使用 Spring AOP 定义一个注解来注解您想要启用授权的查询方法。然后在此注解支持的建议中,打开此过滤器并根据必要时提供当前用户信息。对于没有使用这个注解的查询方法,过滤器被关闭并且不知道授权问题。

基本上它与将授权逻辑附加到查询中相同,但是在 AOP 的帮助和 的性质的帮助下@Filter,业务逻辑不知道任何授权逻辑。

如果 Hibernate 过滤器不适合您的要求,您可以查看哪些数据访问技术允许您通过添加授权逻辑轻松修改查询。例如,使用 JPA Criteria API 也是可能的,因为它提供了对象模型来表示查询,因此将授权逻辑添加到查询中就相当于调整查询对象。

这个想法是,您需要对数据访问层进行适当的设计,以便您可以使用 AOP 来配置底层技术,以便以一致的方式轻松地应用授权问题。并使用 AOP 将授权逻辑与业务逻辑分离。

于 2020-06-21T09:30:43.613 回答