hibernate - 如何在 Hibernate 中限制数据库级别的用户访问

标签 hibernate jboss db2 data-access

应用程序

我需要实现一个可供不同用户使用的网络应用程序。每个用户对不同的表有不同的权限,例如

  • 用户 A 可以看到表 Student 中的字段“name”和“address”
  • 用户 B 可以看到表中的“姓名”和“电话号码”字段,但看不到“地址”学生
  • 用户C可以查看和修改上述所有字段

  • 我将在 UI 级别设置一些内容来限制某些访问,例如为无权修改条目的用户隐藏“编辑”按钮。但是,我认为我应该在较低级别(也许在数据库级别?)有一些东西,以确保数据安全。

    <小时/>

    问题

    我正在为我的应用程序使用 Hibernate、JBoss、DB2 和 Struts。我想我应该使用某种 JBoss LoginModule,它使用用户/密码/角色对数据库进行用户身份验证(但我可能是错的(?))。我做了一些研究并提出了以下选项,但似乎都不适合我的情况。我认为这是多用户网络应用程序中非常常见的数据访问问题。有人可以指出我正确的方向吗? 提前谢谢您!

    1. hibernate.cfg.xml 中的“grant”标签与 JACC 事件监听器结合使用。这可以设置所有hibernate实体的“插入”“更新”“读取”权限。但是,如果我需要更精细的控制怎么办?我需要对某些字段而不是整个对象设置权限。 http://www.hibernate.org/hib_docs/v3/reference/en-US/html/objectstate-decl-security.html

    2. 限制每个ejb的getter/setter方法的权限。如果我理解正确的话,这需要为每个用户配置文件手动配置每个 bean,这对我来说似乎不现实。 EJB Method Permissions

    3. 对 DAO 进行编码以检查用户权限。滚动我自己的实用程序函数,每次调用特定的 DAO 方法时都会检查一个巨大的权限表,以确定登录用户是否可以执行该操作。

    4. 在 Hibernate 中使用“拦截器”和“事件”。为每个类定义特定的“onLoad”、“onSaveorUpdate”等事件和拦截器。在这种情况下,我可以指定各个字段的权限级别吗? http://www.hibernate.org/hib_docs/v3/reference/en-US/html/objectstate-events.html

    我可能对着错误的树吠叫了。以上这些看起来都是劳动密集型的,而且不是很智能化。上述选项都没有为我提供在运行时更改用户权限的编程方法,当管理员级别用户想要在此应用程序中为其他用户提供更多控制权时,这将很有用。


    在这里进行数据访问控制的好方法是什么?

    最佳答案

    1. 向您的实体添加安全 key ,创建权限表,并将用户与权限与实体类型链接起来,并将安全 key 与角色链接起来。这样你就可以这样说:Admin_role可以访问Student(实体类型)并执行读取(权限操作)和写入(操作),而Student_role可以访问他/她自己的Student_key和Read_permission。您可以通过将其重构为实体并向其添加安全 key 来修复该地址。

    2. 您的第四个可能有一个封闭世界的假设,并表示除非您可以针对用户的当前角色,否则将属性名称与字典(实体+属性)中的标志链接到标志,封闭世界假设默认情况下不允许读取。那么你当然不会获得任何写入权限等。

    3. 您可以在数据库中定义 View 并使用数据库身份验证系统为其分配权限。如果您能够自己编写代码,这可能是最干净的方法,即根据我们的角色选择要调用的 View 的方法。 (我以前的 RDBMS 老师会喜欢我这么说的;))这也有点偏离 Hibernate,并将你的东西更多地耦合到数据库。我想,这取决于您的代码需要的可移动性/可移植性。

    4. 在通用 dao (IRepository) 周围使用一个方面,它根据您的权限重写查询;当然,这意味着您在代码中拥有基于权限的安全性。

    隐藏在 GUI 中的编辑按钮实际上只有在您首先将权限移植到代码时才能完成,就像我的第 1 点一样。我建议您看看 Ayendes blog对于这个的开源实现,他是一位非常熟练的编码员。

    关于hibernate - 如何在 Hibernate 中限制数据库级别的用户访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/559480/

    相关文章:

    jakarta-ee - EJB 的 CDI 生产者

    java - Infinispan + WildFly + Spring

    jboss - 如何更改 jboss 时区? Java 属性不起作用

    java - DB2 对 JDBC 查询中多个 JOIN 响应缓慢

    hibernate - 设置hibernate二级缓存

    java - 列不能为空无法插入

    java - 在 Hibernate 中使用更新但仍要创建表

    java - 无法将 Hibernate 与 MySql Azure 数据库连接

    jdbc - 了解 JDBC 跟踪日志

    Java/DB2 首先获取 :n ROWS with custom parameter