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

发布于 2021-02-01 12:24:33

应用程式

我需要实现一个可供不同用户使用的Web应用程序。每个用户在各种表上都有不同的特权,例如

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

我将在UI级别上进行一些操作以限制某些访问,例如,为无权修改条目的用户隐藏“编辑”按钮。但是,我认为我应该在较低级别上(也许在数据库级别上)来确保数据安全。


问题

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

  1. hibernate.cfg.xmlJACC事件侦听器中使用’grant’标签。这可以在所有hibernate实体上设置“插入”,“更新”,“读取”权限。但是,如果我需要更好的控制该怎么办?我需要在某些字段而不是整个对象上设置权限。http://www.hibernate.org/hib_docs/v3/reference/zh-CN/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/zh-CN/html/objectstate-events.html

我可能在错误的树上吠叫。以上所有这些似乎都是劳动密集型的,不是很聪明。以上选项均未提供给我编程方式来在运行时更改用户权限,当管理员级别的用户希望在此应用中为其他用户提供更多控制权时,这将非常有用。

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

关注者
0
被浏览
120
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。
    1. 将安全密钥添加到实体,创建权限表,并将用户与具有实体类型的许可以及具有角色的安全密钥链接。这样,您可以说出类似的话:Admin_role可以访问Student(实体类型)并进行读取(权限中的操作)和Write(操作),而Student_role可以为其自身和Read_permission访问Student_key。您可以通过将地址重构为实体并向其中添加安全密钥来解决该地址。

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

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

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

    实际上,只有在您首先移植代码权限时,才能在gui中隐藏编辑按钮,例如在我的观点1上。我建议您看一下Ayendes博客以获取对此的开源实现,他是一个非常熟练的人。编码器。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看