编写使用数据库的桌面应用。有关如何管理用户对表的访问权限的建议?

时间:2009-08-23 21:11:32

标签: java sql mysql database jdbc

我正在编写一个depsktop应用程序(用Java),它与一个主要存储需求文档的数据库交互,但我有点困境。具体而言,管理用户访问的问题。

为了说明,我将文件夹结构的所有细节存储在一个表中。但是,我想建立一个类似于Linux / Unix系统的用户组机制,你只能添加/ mod / del你有权限的文件夹。当然,我只能为一个或多个表分配数据库权限,而不能为表示他们有权访问的文件夹的单个行分配数据库权限。

对此的一个解决方案是为每个文件夹提供自己的表,然后仅对某些用户提供更新/插入/删除访问权限,但这可不过是一场噩梦,因为#表会爆炸到无法管理的级别。

第二个选项是创建一个位于数据库和客户端之间的服务器端进程,它将返回用户声明拥有的文件夹列表(删除整个表权限问题,现在购买需要我写与此过程交谈的网络协议,而不是直接使用jdbc驱动程序)

最终选项是触发器,虽然我必须支持的数据库(mysql)不容易让我拒绝。考虑到访问频率,我也希望避免由于增加的计算和较慢的性能而引发的触发器。

没有一个是理想的,但我的想法已经不多了。

建议?

4 个答案:

答案 0 :(得分:3)

在PostgreSQL中,这是解决困境的一种相当常见的方法。虽然我没有在MySQL中特别尝试过,但值得考虑。

话虽这么说,在您的应用程序而不是MySQL中管理它可能更好。请继续阅读。


您可以混合使用permission tablesviewsuser()功能。

例如,假设您有一个名为Document的表:

Document_ID | Name | Content
------------+------+--------
1234        | Doc1 | Bla bla
2345        | Doc2 | Bla bla
3456        | Doc3 | Bla bla
------------+------+--------

你有一个名为Document_User的权限表。

Document_ID | User
------------+------+--------
1234        | smith@'%'
2345        | smith@'%'
3456        | smith@'%'
1234        | jones@'%'
2345        | jones@'%'
1234        | white@'%'
------------+------+--------

从上述结构可以看出,User Smith可以访问所有三个文档,User Jones可以访问前两个文档,而User White只能访问第一个文档。

最后,创建一个这样的视图:

CREATE VIEW 
SQL SECURITY DEFINER
    `User_Document`
AS
    SELECT *
    FROM `Document`
    WHERE Document_ID IN 
        (SELECT Document_ID FROM Document_User WHERE User = USER())

当前登录的用户将在User_Document表中看到一组记录,这些记录只是他们有权查看的记录。

答案 1 :(得分:1)

您不应将数据库权限与权限和权限混为一谈。用户代码应通过实现访问限制功能的DAL或服务层。存储权限信息的位置很大程度上取决于您的身份验证机制。如果您具有现有的用户身份验证系统(如Active Directory或LDAP),则可以集成身份验证和授权,或仅集成一个身份验证,并将授权推送到数据库。

基本上对于你的模型来说,你应该有一个用于经过身份验证的实体的表,用户和组的表,它们都有一个FK,然后是一个与auth实体表有FK关系的权限表。

答案 2 :(得分:1)

此应用需要多安全?

如果你只是想保护天真的用户不小心搞砸彼此的文件夹,并且你真的希望你的客户端程序能够直接访问数据库,那么你需要处理桌面客户端本身的文件夹权限。是的,这意味着一个聪明的“黑客”可以在反编译你的java代码并发现数据库的连接信息之后直接连接到数据库,但对于许多小的内部网应用程序来说还是可以的。

对于您希望增长或需要真正细粒度安全性的任何应用程序,在DB和桌面客户端之间实现某种类型的服务器可能是值得的。

答案 3 :(得分:0)

为什么不在应用程序本身内管理访问权限而不是依靠rdbms来进行访问?您可以只拥有一个用户表与表和访问级别,并在访问之前查阅它。