Microsoft Access 2013 数据库中的用户管理

Posted

技术标签:

【中文标题】Microsoft Access 2013 数据库中的用户管理【英文标题】:User management in Microsoft Access 2013 databases 【发布时间】:2013-09-04 13:25:14 【问题描述】:

我正在使用 Microsoft Access 2013 构建一个系统,该系统使用 mysql 作为后端。我正在尝试找出一种方法来进行某种基本的用户管理,理想情况下,用户在启动数据库时必须“登录”,然后系统可以轻松访问他们的用户名,而他们正在使用它。我已经尝试过寻找解决方案,但他们中的大多数只是告诉我使用 Office 365 或 sharepoint,目前还不是选项。有谁知道如何做到这一点?提前致谢!

【问题讨论】:

【参考方案1】:

我建议构建您自己的用户存储和登录系统。您基本上需要创建自己的用户表(在您的情况下是 MySQL),制作表单来管理用户,制作登录表单,并编写代码来控制登录过程。

登录通常包括根据用户表中的现有数据检查他们输入的某种凭据。您通常可以使用 DLookup 或 DCount 语句在 Access 中执行此操作,但我通常最终使用 DAO 或 ADO 记录集,因为我喜欢从用户表中提取多个值,并且我也喜欢立即将内容写回它,如 LastLogin 日期时间、LastLogin 计算机名等。

我实际上写了一个示例数据库,您可以下载here。它需要重写。自 2011 年 1 月以来,我已经改变了很多做法。但是再给我一年,它需要再次重写。

我通常对登录表单进行编程,以便用户输入他们的姓名首字母,然后输入密码。如果您走这条路线,您需要在 Initials 字段上设置唯一索引以防止重复。如果您要拥有很多用户,则需要使用用户名,理论上它仍然可以是用户的首字母。

这是我的代码对用户进行身份验证的样子。请注意,这远非真正安全。这假设密码以纯文本形式存储。理论上,用户可以尝试从这里进行 SQL Inject,因为我没有使用参数化查询或从他们的输入中去除特殊字符,例如 @ 或 ;。

Private Function AuthenticateUser() As Boolean

    Dim sInitials As String
    Dim sPassword As String
    sInitials = Trim(Nz(Me.txtInitials, ""))
    sPassword = Trim(Nz(Me.txtPassword, ""))

    If sInitials = "" Or sPassword = "" Then
        'Logging in with blank passwords is not allowed
        AuthenticateUser = False
        Exit Function
    End If

    If DCount("EmployeeID", "tblEmployees", "[Initials] = '" & Replace(sInitials, "'", "''") & "' AND Password = '" & Replace(sPassword, "'", "''") & "'", True) = 0 Then
        MsgBox "Invalid Credentials."
        AuthenticateUser = False
        Exit Function
    Else
        Dim rs As New DAO.Recordset
        Dim sSQL As String
        sSQL = "SELECT * FROM tblEmployees WHERE initials = '" & Replace(sInitials, "'", "''") & "'"
        Set rs = CurrentDb.OpenRecordset(sSQL)
        If Not (rs.EOF And rs.BOF) Then
            'Config is an instance of a User Defined Type. It could also be a class object.
            Config.UserInitials = rs("Initials")
            Config.UserFullName = rs("EmployeeName")
            Config.UserID = rs("EmployeeID")
            rs.Edit
            rs("LastLoginDateTime") = Now()
            rs("LastLoginComputer") = "Function Required to Get Computer Name"
            rs("ProgVersion") = "Your Program Version Number"
            rs("CurrentDbPath") = Left(CurrentProject.path & "\" & CurrentProject.Name, 254)
            rs.Update
        End If
        rs.Close
        Set rs = Nothing
        AuthenticateUser = True
    End If

End Function

在我的应用程序中,我使用了一个全局对象,在本例中是一个用户定义类型的实例,我称之为 Config。我在应用程序运行期间存储任何类型的应用程序运行时相关设置。当然,当用户关闭应用程序或发生代码重置(这在 Access 运行时不会发生,但在开发过程中经常发生)时,该对象会被销毁。您可以使用类对象而不是用户定义类型。或者您可以对所有内容使用单独的全局变量,我不建议这样做(这是我以前做的)。用户定义类型仅允许您将全局变量组合在一起,并为您提供一种在设计时通过键入 Config. 在代码中引用它们的简单方法,然后使用 Intellisense 显示每个选项(假设您已启用它)。

如果您希望您的设置在代码重置后仍然有效,则需要使用 TempVars。 TempVars 在 Access 2007 中可用。我现在不使用它们(与我的示例数据库相反),因为它们不是强类型的。没有 Intellisense 可以帮助您获得正确的 TempVar,并且您可以在技术上引用一个甚至不存在的 TempVar,并且 Access 不会引发错误。我认为 TempVars 实际上只是一个具有所有缺点的 Dictionary 对象,以及在代码重置中幸存下来的唯一好处。我可以想象在其中存储一个连接字符串,但我想知道是否值得将 TempVars 用于任何事情。如果发生代码重置,我的整个应用程序无论如何都需要重新加载,因为我在应用程序首次打开和用户首次登录时设置了许多全局对象和变量。

仅供参考,在以前版本的 Access 中内置了用户安全功能。我认为 Microsoft 从 2007 年开始停止使用它。我从未真正使用过它,所以当它停止使用时我没有错过它。

【讨论】:

感谢您的回复!我知道这通常是我需要做的,但我正在努力解决一些细节问题。您能否详细介绍一下登录表单的外观以及控制登录过程的代码?用户登录后,当前用户的用户名存储在哪里,以便我可以参考?那么有没有办法根据用户类型(由 MySQL 数据库中的某个单元确定)控制他们可以与 Access 系统的哪些部分进行交互?

以上是关于Microsoft Access 2013 数据库中的用户管理的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 2013 数据库中的用户管理

Microsoft Access 2013 输入参数值 [关闭]

Microsoft Access Runtime 2013 - 从 Excel 导入

在 Microsoft Access 2013 中,如何访问当前 ODBC 连接的用户名?

在 Microsoft Access 2013 中的数据表子窗体上单击一行时运行 VB

如何使用 SQL 在 Microsoft Access 2013 中创建查找字段?