【问题标题】:Access Database Security Question访问数据库安全问题
【发布时间】:2010-08-26 09:02:52
【问题描述】:

我在 Access 2003 中有一个数据库,我只希望某些人能够访问它。 在我的数据库中,我有一个表格,列出了应该能够访问数据库的人员。 (Tbl_BIRT_Users)。该表包含他们的姓名、ntlogin 和电子邮件地址。它还有一个“管理员”字段。

我的问题分为两部分:

1 - 在打开数据库时,我怎样才能让它查找此人的 ntlogin(环境用户名)并确保该人有权使用数据库?

2 - 我需要数据库查看“管理员”是/否字段并授予非管理员只读访问权限和管理员完全访问权限。

谢谢!

【问题讨论】:

  • 虚假安全并不会真正让您获得任何东西,只会让您感觉自己已经完成了某些事情,而实际上却没有。如果您的数据确实需要安全,那么您不应该使用 MDB 来存储它——您需要一个合适的数据库服务器来实现真正的安全性。

标签: ms-access vba ms-access-2003


【解决方案1】:

使用 API 调用获取登录名 - API: Get Login name 您可以在命令提示符下更改环境变量,然后,如果从命令提示符启动 Access,Access 将使用欺骗的环境变量。

还有一些方法可以轻松破坏表驱动的安全性,例如用户将后端数据库带回家到 Access 的零售副本,更改表中的值并将数据库带回办公室。

【讨论】:

    【解决方案2】:

    即使您相信用户不会摆弄他们的环境变量,也请采纳 Tony 的建议。添加他链接的模块后,检索用户的帐户名称是对 fOSUserName() 函数的简单调用。这实际上并不比从用户环境中获取它更难。

    但我想补充 Tony 关于“容易破坏表驱动的安全性”的观点。您的计划是检查用户是否是您的授权用户之一。我的建议是将您的后端数据库文件放在只有您的授权用户才能访问的位置。使用 Windows 文件系统权限将其他人拒之门外。这样你就可以决定你甚至不需要检查你的表来确定用户是否被授权。您仍然可以使用表数据来确定用户是管理员还是普通用户。或者,如果它让您的经理安心,您可能会决定保留授权检查……即使它并不能真正提供太多安全性。

    【讨论】:

      【解决方案3】:

      你能不能只做这样的事情

      Dim rst as Recordset
      Dim sql as string
      
      sql = "SELECT * FROM Tbl_BIRT_Users WHERE ntlogin = '" & Environ("UserName") & "'"
      set rst = CurrentDb.OpenRecordset(sql)
      
          if (rst.bof and rst.eof) then
              /*not a valid user*/
              DoCmd.Quit
          else
             if not rst!Administrator then
               /*make read only*/
             end if
          end if
      
      rst.close
      

      【讨论】:

        【解决方案4】:

        这是我使用的 Access 安全门面装饰。

        Public Function SecurityCode() 
        '*  Purpose:    Limits access to program
        
            Dim sUserID    As String
            Dim sUserName   As String    
        
        '*  Determines user from Windows Login
            sUserID = Environ("USERNAME")
        
        
        '*  Lookup on BE table of Allowed Users to verify on the list.
             sUserName = DLookup("[UserName]", "tbl_AllowedUsers", "ID = '" & sUserID & "'")
        
        
        If Len(sUserName) > 0 Then
            'Allowed User, opens Main Switchboard
        
            'Set global variable for Admin rights
            g_Admin = DLookup("[AdminRights]", "tbl_AllowedUsers", "ID = '" & sUserID & "'")
        
            DoCmd.OpenForm "Switchboard"
            DoCmd.SelectObject acForm, "Switchboard", True
            DoCmd.RunCommand acCmdWindowHide
        
        Else
            'Not on the Allowed Users list, opens to a Password Page
            DoCmd.OpenForm "frm_LockPage"
            DoCmd.SelectObject acForm, "frm_LockPage", True
            DoCmd.RunCommand acCmdWindowHide
        End If
        
        
        End Function
        

        【讨论】:

          【解决方案5】:

          试试下面的方法:

          Function RealName()
          payroll = Environ("Username")
          
          firstname = DLookup("[first name]", "[Payroll Numbers]", "[persno] = " & payroll)
          lastname = DLookup("[Last name]", "[Payroll Numbers]", "[persno] = " & payroll)
          
          If IsNull(firstname) = True Then
          RealName = payroll
          Else
          RealName = firstname & " " & lastname
          End If
          
          End Function
          

          然后您可以在 form_load 事件中输入代码以确保它是经过验证的用户。

          【讨论】:

          • 依赖环境变量确实是一件很不稳定的事情,因为用户可以打开命令提示符,将 %USERNAME% 环境变量设置为他们想要的任何内容,然后从在那里。
          • 大卫,我知道这很不稳定。在我的环境中,通常每个数据库都有 10 个及以下的用户,计算机知识非常低,因此可以正常工作。当然有更好的方法可以做到这一点,但这一直对我有用。显然工资单等是我公司特有的。
          • 使用环境变量是最假的安全类型。
          猜你喜欢
          • 1970-01-01
          • 2014-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-15
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          相关资源
          最近更新 更多