0

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

4

1 回答 1

1

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

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

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

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

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

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 在代码中引用它们的简单方法,

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

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

于 2013-09-04T13:33:06.297 回答