如何为 Hibernate 查询集成用户权限/限制?
Posted
技术标签:
【中文标题】如何为 Hibernate 查询集成用户权限/限制?【英文标题】:How to integrate user permissions/restrictions for Hibernate queries? 【发布时间】:2013-11-19 05:46:43 【问题描述】:我在我的 java Web 应用程序中使用 Spring Security 和 Hibernate 从数据库中获取数据。我们现在需要根据用户所在的页面和他们拥有的访问级别来限制用户可以检索的结果。即。
对于第一页,管理员可以查看所有内容,管理员可以查看/搜索属性为 A 的所有内容,其中值为 X,站点管理员只能查看/搜索该页面上的所有内容,属性 B 是值 Y。
目前我们使用了一个写得很糟糕的 HQL 函数,它根据传入的用户和位置拼凑一个字符串查询。它是一个非常大的 If...Else if....else...if else
等。
我试图通过使用 Hibernate FullTextFilter 注释以更加程序化的方式来解决这个问题。但是,我需要通过一个主键的属性在 join table 上进行搜索,我认为这不太好。
根据不同的权限从数据库中获取项目的最佳做法/推荐方法是什么?
【问题讨论】:
您是否针对当时遇到的这个问题提出了适当的解决方案?我面临着同样的问题,除了用你在问题中描述的 if 语句硬编码“where”子句之外,找不到其他方法。 抱歉这是很久以前的事了,我不记得了。 【参考方案1】:由于您的用户具有角色,因此您可以在服务层上使用 spring 安全注释(最好)来保护这些方法不会在未经许可的情况下被用户调用。在您的视图中,您可以使用 spring security jsp 标签来隐藏他们无法访问的项目。 spring security jsp tag, to secure urls and methods 所以如果在你的jsp页面中你想隐藏一些东西(只有具有角色主管的用户才能看到)它会像这样(取决于你的需要)
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<sec:authorize access="hasRole('supervisor')">
This content will only be visible to users who have
the "supervisor" authority in their list of <tt>GrantedAuthority</tt>s.
</sec:authorize>
您还可以定义什么类型的用户可以调用这样的方法:
@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);
查看文档,您应该能够通过使用此库来实现您想要做的事情。
希望对你有帮助。
【讨论】:
我们实际上使用<sec:authorize>
标记来表示不同用户角色的表。然而,所有用户都可以看到许多元素,只是他们可以访问数据库中的哪些记录不同。因此,当最初填充表时,我们使用 hibernate FullTextFilters
用正确的行填充表。但是现在在表上搜索时,我们还需要根据权限限制搜索结果。
读了一点之后,听起来为各个角色创建单独的索引是首选选项。虽然它可能不适用于这种情况,因为访问角色并不是真正静态的、漂亮/整洁的集合。
好吧,如果没有静态角色,我想我不知道该怎么做
它们在技术上是静态角色,只是角色没有指定“角色 X 只能看到记录 A、B、C”,而更像是“角色 X 可以看到任何记录b>attribute A 等于 B 和 C”,并且角色指定该属性应该等于什么。所以很自然地,看起来最好有一个“Select ...Where”HQL 语句,但是针对不同情况连接所有这些字符串非常笨拙和混乱。
好吧,不需要太多 if else if 语句,而是可以通过连接来完成。带有命名本机查询的示例-> select * from someTable t,otherTable o where t.a = o.b and t.a = o.c and t=:tvalue 。然后你做 Query query = session.getNamedQuery("nameofNamedQuery").setString("tvalue","somevalue");以上是关于如何为 Hibernate 查询集成用户权限/限制?的主要内容,如果未能解决你的问题,请参考以下文章