2013-09-04 3 views
0

MySQL을 백엔드로 사용하는 Microsoft Access 2013을 사용하여 시스템을 구축하고 있습니다. 데이터베이스를 시작할 때 사용자가 "로그인"해야하고 그런 다음 사용자 이름이 시스템에서 쉽게 액세스 할 수있는 방식으로 이상적인 기본적인 사용자 관리를 수행하는 방법을 알아 내려고 노력하고 있습니다. 사용하고 있습니다. 솔루션 검색을 시도했지만 대부분 Office 365 나 셰어 포인트를 사용하라고 말합니다.이 옵션은 현재로서는 옵션이 아닙니다. 누구든지 이것을 달성하는 방법에 대한 아이디어가 있습니까? 미리 감사드립니다!Microsoft Access 2013 데이터베이스의 사용자 관리

답변

1

나만의 사용자 저장소 및 로그인 시스템을 구축하는 것이 좋습니다. 기본적으로 자신 만의 users 테이블 (자신의 경우에는 MySQL)을 만들고, 폼을 만들어 사용자를 관리하며, 로그인 폼을 만들고, 로그인 프로세스를 제어하는 ​​코드를 작성해야합니다.

로깅은 일반적으로 사용자 테이블의 기존 데이터에 대해 입력 한 자격 증명을 확인하는 것으로 구성됩니다. 일반적으로 Access에서 DLookup 또는 DCount 문을 사용하여이 작업을 수행 할 수 있지만 대개 DAO 또는 ADO 레코드 세트를 사용하게됩니다. 사용자의 테이블에서 둘 이상의 값을 꺼내고 싶기 때문에 나중에 다시 작성하는 것이 좋습니다. LastLogin datetime, LastLogin 컴퓨터 이름 등

실제로 예제 데이터베이스를 작성하여 here을 다운로드 할 수 있습니다. 재 작성이 필요합니다. 나는 2011 년 1 월 이후로 많은 관행을 바꿨습니다.하지만 1 년을 더 주면 다른 재 작성이 필요할 것입니다.

나는 보통 사용자가 이니셜을 입력 한 다음 암호를 입력하도록 로그인 양식을 프로그래밍합니다. 이 경로를 선택하면 중복을 방지하기 위해 이니셜 필드에 고유 한 인덱스 설정이 필요합니다. 많은 사용자가있을 경우 Username을 대신 사용해야하며 이론적으로는 사용자 초기자가 될 수도 있습니다.

다음은 사용자 인증을위한 내 코드입니다. 이것이 실제로 안전하다는 것과는 거리가 멀다는 것을 알아 두십시오. 암호가 일반 텍스트로 저장된다고 가정합니다. 사용자는 이론적으로 여기에서 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 

나는이 경우, 내가 구성 전화 사용자 정의 형식의 인스턴스를 글로벌 객체를 사용합니다. 나는 응용 프로그램의 런타임 동안 거기에 응용 프로그램 런타임 관련 설정의 모든 종류를 저장합니다. 물론이 객체는 사용자가 응용 프로그램을 닫거나 코드 재설정이 발생하면 파괴됩니다 (Access 런타임에서는 발생하지 않지만 개발 중에는 자주 발생합니다). 사용자 정의 유형 대신 클래스 객체를 사용할 수 있습니다. 또는 모든 것에 대해 개별 전역 변수를 사용할 수는 있지만 권장하지 않습니다 (이전에했던 것). 사용자 정의 유형을 사용하면 전역 변수를 그룹으로 묶을 수 있으며 구성 시간에 코드를 입력하면 코드에서 쉽게 참조 할 수 있습니다. 그러면 Configurator가 Intellisense를 사용하여 모든 옵션을 표시합니다 (사용하도록 설정 한 경우).

코드 재설정시에도 설정을 유지하려면 TempVars를 사용해야합니다. TempVars는 Access 2007에서 사용할 수있게되었습니다. 강하게 입력되지 않았기 때문에 지금은 사용하지 않습니다 (예제 데이터베이스와 반대). 올바른 TempVar를 얻는 데 도움이되는 Intellisense가 없으며 기술적으로 TempVar를 참조 할 수 있으며 Access에서도 오류가 발생하지 않습니다. 나는 TempVars가 정말로 그것의 단점들과 코드 리셋에서 생존의 단일 이익을 가진 단지 Dictionary 객체라고 생각한다. 내가 거기에 연결 문자열을 저장 상상할 수 있지만 그것은 아무것도 가치가 TempVars를 사용하여 가치가 있는지 궁금해. 코드 재설정이 발생하면 응용 프로그램을 처음 열 때 사용자가 처음 로그인 할 때 많은 전역 객체와 변수를 설정했기 때문에 전체 응용 프로그램을 다시로드해야합니다.

참고로 이전 버전의 Access에는 사용자 보안이 내장되어있었습니다. Microsoft는 2007 년부터 중단 한 것으로 생각합니다. 사용하지 않았으므로 사용이 중단되었을 때 놓치지 않았습니다.

+0

응답 해 주셔서 감사합니다. 나는 이것이 일반적으로 내가해야 할 일인 줄 알지만, 나는 구체적인 것들로 고심하고있다. 로그인 양식의 모양과 로그인 프로세스를 제어하는 ​​코드에 대해 자세히 설명해 주시겠습니까? 사용자가 로그인하면 현재 사용자의 사용자 이름이 저장되어 있으므로 참조 할 수 있습니까? 그런 다음 사용자 유형 (MySQL 데이터베이스의 일부 셀에 의해 결정됨)에 따라 상호 작용할 수있는 액세스 시스템의 부분을 제어하는 ​​방법이 있습니까? –

관련 문제