我正在使用spring框架构建一个REST API,并遇到一个不太有趣的案例,我似乎找不到解决方案。
所以我们假设我们有Table1,其中包含Col1,Col2和Col3列 我们有访问级别1,2和3的用户
访问级别3的用户是唯一允许访问Col3以及所有其他列的用户,其余用户可以访问其他任何列。
此外,我希望API能够根据调用IE返回字段的子集:如果调用URL / table / list?fl = col1,则只返回Col1的值
我需要的是一种在API级别上返回此特定数据子集的方法,显然弹出数据JPA不允许返回表的动态子集。
我想知道在没有完全放弃JPA或者必须重写所有实体中的所有功能的情况下,最干净的方法是什么。
答案 0 :(得分:1)
让我告诉你我的想法。
我需要的是一种返回这个特定数据子集的方法 在API级别上,显然弹簧数据JPA不允许返回a 表的动态子集。
这是不正确的,JPA允许检索实体的某些部分,当你在@Query方法的查询中选择特定列时不需要返回完整的实体,因为你使用的是jpql或本机查询你应该只返回实体和弹簧数据的一部分会自动返回List,阅读更多here
现在要管理对我建议使用Spring Security实现某些方法的方法的访问,它允许用@PreAuthorize注释一些方法
@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);
这意味着只有拥有该角色的用户才能访问 “ROLE_USER”。
因此它将根据角色限制执行,因此我的建议是限制基于角色的访问权限,并使用几个spring jpa方法根据角色仅检索列的子集。
另一种选择是创建动态jpql并直接在entityManager中执行,它将使您可以使用@SqlResultMapping映射直接获取实体而不是对象列表。