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

tom*_*ato 6 db2 jboss hibernate data-access

该应用程序

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

  • 用户A可以从表中查看字段"名称"和"地址" Student
  • 用户B可以查看字段"名称"和"电话号码",但不能查看表中的"地址" Student
  • 用户C可以查看和修改上述所有字段

  • 我将在UI级别有一些限制某些访问的内容,例如为没有修改条目权限的用户隐藏"编辑"按钮.但是,我认为我应该在较低级别(在数据库级别可能?)有一些东西,以确保数据安全.


    问题

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

    1. hibernate.cfg.xmlJACC事件侦听器中使用'grant'标记.这可以在所有休眠实体上设置"插入""更新""读取"权限.但是,如果我需要更精细的控件怎么办?我需要在某些字段而不是整个对象上设置权限.http://www.hibernate.org/hib_docs/v3/reference/en-US/html/objectstate-decl-security.html

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

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

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

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


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

    Hen*_*rik 3

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

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

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

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

    隐藏在 GUI 中的编辑按钮实际上只有在您首先将权限移植到代码时才能完成,就像我的第 1 点一样。我建议您查看Ayendes 博客以获取此功能的开源实现,他是一位非常熟练的人编码器。