0

MySQL をバックエンドとして使用する Microsoft Access 2013 を使用してシステムを構築しています。理想的には、ユーザーがデータベースを起動するときに「ログイン」する必要があり、ユーザー名がシステムから簡単にアクセスできるような方法で、ある種の基本的なユーザー管理を行う方法を見つけようとしています。使用しています。解決策を探してみましたが、ほとんどの場合、Office 365 または SharePoint を使用するように言われましたが、現時点ではこれらはオプションではありません。これを達成する方法を知っている人はいますか?前もって感謝します!

4

1 に答える 1

1

独自のユーザー ストレージとログイン システムを構築することをお勧めします。基本的に、独自の users テーブルを作成し (あなたの場合は MySQL に)、ユーザーを管理するためのフォームを作成し、ログイン フォームを作成し、ログイン プロセスを制御するコードを記述する必要があります。

通常、ログインは、ユーザー テーブル内の既存のデータに対して、入力したある種の資格情報をチェックすることで構成されます。通常、これは Access で DLookup または DCount ステートメントを使用して行うことができますが、代わりに DAO または ADO レコードセットを使用することになります。これは、User のテーブルから複数の値を引き出すのが好きで、すぐに書き戻すのも好きだからです。 、LastLogin 日時、LastLogin コンピュータ名など。

ここからダウンロードできるサンプルデータベースを実際に作成しました。書き直しが必要です。2011 年 1 月以降、かなりの数のプラクティスを変更しました。

私は通常、ユーザーがイニシャルとパスワードを入力するようにログイン フォームをプログラムします。この方法を使用する場合は、重複を防ぐために、イニシャル フィールドに一意のインデックスを設定する必要があります。多くのユーザーがいる場合は、代わりにユーザー名を使用する必要がありますが、これは理論的にはユーザーのイニシャルである可能性があります。

ユーザーを認証するための私のコードは次のようになります。これは本当に安全ではないことに注意してください。これは、パスワードが平文で保存されていることを前提としています。私はパラメーター化されたクエリを使用したり、@ や ; などの入力から特殊文字を削除したりしていないため、ユーザーは理論的にはここから 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.

コードをリセットしても設定を維持したい場合は、TempVars を使用する必要があります。TempVars は Access 2007 で使用できるようになりました。厳密に型指定されていないため、(サンプル データベースとは対照的に) 現在は使用していません。正しい TempVar を取得するのに役立つ Intellisense はありません。技術的には存在しない TempVar を参照することもでき、Access はエラーをスローしません。TempVars は、実際にはすべての欠点を備えた単なる Dictionary オブジェクトであり、コードのリセットに耐えられるという唯一の利点があると思います。そこに接続文字列を保存することは想像できますが、TempVars を何かに使用する価値があるかどうかは疑問です。コードのリセットが発生した場合、アプリケーションを最初に開いてユーザーが最初にログインしたときに多くのグローバル オブジェクトと変数をセットアップするため、アプリケーション全体をリロードする必要があります。

参考までに、以前のバージョンの Access にはユーザー セキュリティが組み込まれていました。Microsoft は 2007 年からそれを廃止したと思います。

于 2013-09-04T13:33:06.297 に答える