我正在编写一个depsktop应用程序(用Java),它与一个主要存储需求文档的数据库交互,但我有点困境。具体而言,管理用户访问的问题。
为了说明,我将文件夹结构的所有细节存储在一个表中。但是,我想建立一个类似于Linux / Unix系统的用户组机制,你只能添加/ mod / del你有权限的文件夹。当然,我只能为一个或多个表分配数据库权限,而不能为表示他们有权访问的文件夹的单个行分配数据库权限。
对此的一个解决方案是为每个文件夹提供自己的表,然后仅对某些用户提供更新/插入/删除访问权限,但这可不过是一场噩梦,因为#表会爆炸到无法管理的级别。
第二个选项是创建一个位于数据库和客户端之间的服务器端进程,它将返回用户声明拥有的文件夹列表(删除整个表权限问题,现在购买需要我写与此过程交谈的网络协议,而不是直接使用jdbc驱动程序)
最终选项是触发器,虽然我必须支持的数据库(mysql)不容易让我拒绝。考虑到访问频率,我也希望避免由于增加的计算和较慢的性能而引发的触发器。
没有一个是理想的,但我的想法已经不多了。
建议?
答案 0 :(得分:3)
在PostgreSQL中,这是解决困境的一种相当常见的方法。虽然我没有在MySQL中特别尝试过,但值得考虑。
话虽这么说,在您的应用程序而不是MySQL中管理它可能更好。请继续阅读。
您可以混合使用permission tables
,views
和user()
功能。
例如,假设您有一个名为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来进行访问?您可以只拥有一个用户表与表和访问级别,并在访问之前查阅它。