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

时间:2013-09-04 13:25:15

标签: mysql ms-access ms-access-2013

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

1 个答案:

答案 0 :(得分:1)

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

登录通常包括检查他们在用户表中的现有数据中键入的某种凭据。您通常可以在Access中使用DLookup或DCount语句执行此操作,但我通常最终使用DAO或ADO记录集,因为我喜欢从用户表中提取多个值,我也想立即回复它,如LastLogin datetime,LastLogin computername等。

我实际上编写了一个示例数据库,您可以下载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一起提供。我现在不使用它们(与我的示例数据库相反),因为它们不是强类型的。没有智能感知来帮助你获得正确的TempVar,你可以在技术上引用一个甚至不存在的TempVar,Access不会抛出错误。我认为TempVars实际上只是一个包含所有缺点的Dictionary对象,以及幸存代码重置的唯一好处。我可以想象在那里存储一个连接字符串,但我想知道是否值得使用TempVars。如果发生代码重置,我的整个应用程序都需要重新加载,因为我在应用程序首次打开并且用户首次登录时设置了许多全局对象和变量。

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