在Hibernate中如何在数据库级别限制用户访问 应用程序

在Hibernate中如何在数据库级别限制用户访问 应用程序,hibernate,jboss,db2,data-access,Hibernate,Jboss,Db2,Data Access,我需要实现一个web应用程序,将由不同的用户使用。每个用户对不同的表具有不同的权限,例如 用户A可以从表中查看字段“姓名”和“地址”Student 用户B可以从表Student 用户C可以查看和修改上述所有字段 我将在UI级别上设置一些限制特定访问的功能,例如,为没有修改条目权限的用户隐藏“编辑”按钮。但是,我认为我应该在较低的级别(可能在数据库级别?)上使用一些东西,以确保数据安全 问题 我的应用程序使用Hibernate、JBoss、DB2和Struts。我想我应该使用某种JBoss L

我需要实现一个web应用程序,将由不同的用户使用。每个用户对不同的表具有不同的权限,例如

  • 用户A可以从表中查看字段“姓名”和“地址”
    Student
  • 用户B可以从表
    Student
  • 用户C可以查看和修改上述所有字段

  • 我将在UI级别上设置一些限制特定访问的功能,例如,为没有修改条目权限的用户隐藏“编辑”按钮。但是,我认为我应该在较低的级别(可能在数据库级别?)上使用一些东西,以确保数据安全


    问题 我的应用程序使用Hibernate、JBoss、DB2和Struts。我想我应该使用某种JBoss LoginModule,它使用user/password/roles(但我可能错了(?)来验证数据库中的用户。我做了一些研究,并提出了以下选择,但似乎没有一个适合我的情况。我认为这是多用户web应用中非常常见的数据访问问题。谁能给我指一下正确的方向吗?提前谢谢你

  • 在JACC事件侦听器中使用
    hibernate.cfg.xml
    中的“grant”标记。这可以在所有hibernate实体上设置“插入”“更新”“读取”权限。但是,如果我需要更精细的控件怎么办?我需要对某些字段而不是整个对象设置权限

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

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

  • 在Hibernate中使用“拦截器”和“事件”。为每个类定义特定的“onLoad”、“onSaveorUpdate”等事件和拦截器。在这种情况下,我可以为各个字段指定权限级别吗

  • 我可能找错树了。所有这些似乎都是劳动密集型的,不是很聪明。以上选项都没有为我提供在运行时更改用户权限的编程方法,这在管理员级别的用户希望在此应用程序中为其他用户提供更多控制时非常有用


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

  • 向实体添加安全密钥,创建权限表,并将具有entitytype权限的用户链接到entitytype,还将安全密钥链接到role。通过这种方式,您可以这样说:管理员角色可以访问学生(实体类型)和执行读取(权限中的操作)和写入(操作),而学生角色可以访问他/她自己的学生密钥和读取权限。您可以通过将地址重构为实体并向其添加安全密钥来修复该地址

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

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

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

  • 只有首先将权限移植到代码中,才能真正完成gui中隐藏的编辑按钮,如我的第1点。我建议您看看这个的开源实现,他是一个非常熟练的程序员。

    我喜欢使用视图的建议

    Hibernate可能会起作用,但我认为它们更适合过滤行而不是列


    您还可以使用[基于地图的动态模型](http://www.hibernate.org/hib_docs/reference/en/html/persistent-classes-dynamicmodels.html)以及单独的[命名查询](http://www.hibernate.org/hib_docs/reference/en/html/querysql-namedqueries.html),而不是有部分填充的豆子。然后,您的视图代码只需检查映射是否包含“address”的条目,如果找到,则显示字段?另一个选项可能是使用自定义类型。例如,与其将字符映射到字符串,不如将其映射到自定义类型,如SecureString。在映射中为其指定一个具有某种唯一标识符的参数,例如table.column。然后,在自定义类型的nullSafeGet方法中,可以调用安全服务来查看是填充值还是将其设置为null。您可能还必须使用ThreadLocal来存储一些东西来标识用户或角色。您只需要创建一些自定义类型来包装string、double、date、integer等。我做了一些类似的事情,允许将日期转换为用户的时区