【问题标题】:Using Spring JpaRepository (backed with hibernate), is there a way to conditionally filter a field based on a GrantedAuthority?使用 Spring JpaRepository(由休眠支持),有没有办法根据 GrantedAuthority 有条件地过滤字段?
【发布时间】:2019-07-04 14:37:00
【问题描述】:

使用 Spring Data、Spring Security 和 Hibernate,有没有办法根据当前用户拥有的 GrantedAuthories 过滤选择的列?

例如:

Entity
{
  field1;
  @HasGrantedAuthority('XYX')
  field2;
  field3;
}

鉴于上述示例,我希望始终返回 field1 和 field3,但仅当用户拥有 GrantedAuthority == 'XYZ' 时才返回 field2。

SELECT * FROM Entity
vs
SELECT field1, field3 FROM Entity

我已经研究过使用 Jackson 的 @JsonView,但是这会将数据过滤回客户端,这很好,但我想在此之前过滤它并防止服务器端应用程序甚至拥有门控列。 https://www.baeldung.com/spring-security-role-filter-json

Hibernate 的 @Filter 似乎过滤掉了整行,但我只想要一个特定的列。此外,似乎没有与 Spring Data 的原生集成。

【问题讨论】:

  • 这在实体级别是不可能的。一个原因是 Java 是静态类型的,然后该值将为 null 并且不会像 JSON 中那样丢失
  • 我在spring数据层的过滤也很完美。

标签: java hibernate jackson spring-data


【解决方案1】:

不幸的是,没有任何功能可以限制属性的选择,具体取决于个人的权限。但是你可以做两件事:

首先,可以使用惰性属性加载

使用@Basic(fetch = FetchType.LAZY) 然后加载它以防有人需要权限。

其次,您可以根据所需权限的可用性使用projection

在您的服务层中创建 if 语句并根据结果执行不同的存储库方法。在否定情况下,您只需检索投影,在肯定情况下,您检索整个实体。这种方法将为您带来最佳性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2021-02-25
    • 2021-05-31
    相关资源
    最近更新 更多