【发布时间】:2014-09-13 12:12:39
【问题描述】:
所以经过一番挖掘后,我意识到 Access 2007 没有内置的用户级安全选项。我需要做的是限制用户可以根据登录者编辑的记录(他们可以看到所有数据,但只有编辑自己的)。我在想我可以制作一个登录表单并分配密码然后从那里开始,但我想知道是否有更好的方法来做到这一点。
【问题讨论】:
标签: security ms-access vba ms-access-2007
所以经过一番挖掘后,我意识到 Access 2007 没有内置的用户级安全选项。我需要做的是限制用户可以根据登录者编辑的记录(他们可以看到所有数据,但只有编辑自己的)。我在想我可以制作一个登录表单并分配密码然后从那里开始,但我想知道是否有更好的方法来做到这一点。
【问题讨论】:
标签: security ms-access vba ms-access-2007
对于数据库中表单的只读、读写用户权限,我们实现了以下表格、逻辑。
我创建了一个权限表以及登录表。数据库中的每个屏幕都将对每个用户具有只读或读写权限。我将所有屏幕名称插入特权表。另一个表 UserPrivilege 将拥有用户及其权限。为用户分配权限只能由管理员用户完成。
每个表单开始时的功能检查是否允许指定用户查看或编辑表单。如果他/她被授予只读权限,我们将锁定表单上所有通过控件循环的控件。否则,无事可做。或者在设计它们时将所有控件保持只读,并通过代码解锁它们以获得写入权限。
向最终用户交付版本时,数据库窗口将保持隐藏状态。这可以防止对数据库中的表进行常规、简单的查看,在数据库窗口中打开表单、报告对象。在制作 mde/accde 之后,可以再做一些调整,这样用户就不容易直接查看表格。绕过启动、特殊键等。
【讨论】:
我也遇到过这个问题。我的解决方案(尚未被打破)就是这样做。制作一个带有密码的用户表和一个读取用户名、密码和用户类型表的登录表单。我使用了两种方法从那里开始:Case 语句为该用户的函数或全局变量(在模块中(枚举帮助))打开特定的导航表单,以及在每个表单的打开事件和更改中检查的 getter 函数AllowEdits 和 AllowAdditions 之类的属性,如果是管理内容,甚至取消表单打开。
此设置中最重要的部分是确保用户使用 Access Runtime。如果他们使用您正在开发的 Access 版本,他们可以稍微窥探一下并绕过这个问题。
确保隐藏用户的表格。
可以通过创建数据库的快捷方式并将/runtime 添加到快捷方式路径的末尾(带有空格)来强制访问运行时。
它并不完美,但它适用于我的目的,它可能适用于你的目的。
我在 2010 年确实做到了这一点,但 2007 年应该差不多。
【讨论】:
在 Access 中分配用户名/密码(尤其是访问后端)有许多值得指出的关键问题。首先,如果您不加密您的数据库,那么您的任何有能力去寻找它的用户都将能够找到它,因此可以完全访问它。如果您加密数据库,如果任何人都可以访问您的源代码,那么您就高兴了,因为他们将能够看到存储在代码中的数据库用户/密码。如果您使用其他 SQL 数据库,此问题仍然存在,但至少在这些情况下,您可以限制提供给 Access .accdb 文件的用户以具有某些权限。
就我而言,我有 3 个安全级别。首先,我严格限制了我发送的内容,使得访问源代码变得非常困难,无论如何你都必须这样做。其次,我使用不同的数据库密码分配不同级别的访问(我使用的是 MySQL 后端,你可以对 SQLServer 后端做同样的事情,但使用 Jet 你就不走运了),所以即使用户可以看到数据库用户和密码,他们可以做的事情是有限的。第三,由于我部署在公司网络上,我利用 Windows 组,并使用它们过滤掉不同用户可见的内容。这样,用户只有在我们的网络上通过身份验证后才能使用表单。如果文件发现它不在网络上,它会自行删除并终止。
Function IsMember(strDomain As String, strGroup _
As String, strMember As String) As Boolean
Dim grp As Object
Dim strpath As String
strpath = "WinNT://" & strDomain & "/"
Set grp = GetObject(strpath & strGroup & ",group")
IsMember = grp.IsMember(strpath & strMember)
End Function
Function GetCurrentUser() As String
GetCurrentUser = VBA.Environ$("USERNAME")
End Function
Function GetCurrentDomain() As String
GetCurrentDomain = VBA.Environ$("USERDOMAIN")
End Function
【讨论】: