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