用户级安全性?

时间:2013-11-05 19:32:52

标签: sql vba ms-access code-access-security

我有一个表,其中包含用户名,密码和isadmin的是/否列。

如果他们使用“isadmin”下方有复选标记的帐户登录,他们可以访问设计视图,功能区等,如何制作?虽然如果他们使用isadmin框下没有复选标记的帐户登录,他们只能查看表单,而不能编辑它们,并且功能区无法访问?

我只是不知道从哪里开始,因为我认为有一种方法可以将数据库保存为单独的副本,只有用户可以查看表单,如果管理员运行他的副本,他将获得所有更改用户制作的表格(通过表格)。因此,当管理员编辑表单并保存表单时,它不会删除所有用户的数据,就像保存时一样,它也会保存到管理员的副本中。我真的很困惑。

我正在使用Access 2013

1 个答案:

答案 0 :(得分:4)

这是一个简单的解决方案,可以在较新版本的Access中删除用户级安全性;使用了很多VBA。

第1步:创建表

首先,创建一个表。我将我的名字命名为LogininfoT。现在,对于表格内的列,将其命名为EmployeeIDLoginIDLoginPasswordEmployeeName,最后为IsAdmin。将EmployeeID设为您的密钥,将IsAdmin设为是/否字段。

要进行测试,请将两个用户添加到此表中。有了这些信息:

EmployeeID LoginID LoginPassword EmployeeName IsAdmin
1          1111    1234          Bob          [x]
2          2222    1234          Stewert      [ ]

第2步:创建表单

现在我们已经制作了表格,让我们设计表格来使用这组数据。

我将我的表格命名为LoginF。进入设计视图,然后单击文本框,组合框和按钮。对于组合框,重命名文本以表示登录ID(您可以将其更改为适合您的需要),对于文本框,将文本设置为密码(再次将其更改为您想要的任何内容'影响结果)。按钮中的文字可以是你想要的任何内容,我将登录它。

单击组合框并重命名。我将命名为LoginCmBx。接下来,单击文本框并重命名,我将命名为PasswordTxt。最后,单击按钮并重命名,我将命名为LoginBtn。

再次单击组合框,然后在事件选项卡下,进入After Update脚本。使用代码并在:

中键入
Private Sub LoginCmBx_AfterUpdate()

    Me.PasswordTxt.SetFocus

End Sub

这样,在您选择用户名后,它会自动将焦点放在密码文本框中,这样您就可以立即开始输入,而无需在键盘上使用TAB或使用鼠标。

接下来,转到按钮并在事件选项卡下,进入On Click脚本。使用代码并在:

中键入
Private Sub LoginBtn_Click()

    If IsNull(Me.LoginCmBx) Or Me.LoginCmBx = "" Then
      MsgBox "You must enter a User Name.", vbOKOnly, "Required Data"
        Me.LoginCmBx.SetFocus
        Exit Sub
    End If

    If IsNull(Me.PasswordTxt) Or Me.PasswordTxt = "" Then
      MsgBox "You must enter a Password.", vbOKOnly, "Required Data"
        Me.PasswordTxt.SetFocus
        Exit Sub
    End If

    If Me.PasswordTxt.Value = DLookup("LoginPassword", "LoginInfoT", _
            "[EmployeeID]=" & Me.LoginCmBx.Value) Then

        EmployeeID = Me.LoginCmBx.Value

           On Error Resume Next
           DoCmd.DeleteObject acQuery, "IsAdminQ"
   On Error GoTo Err_LoginBtn_Click

   Dim qdef As DAO.QueryDef
   Set qdef = CurrentDb.CreateQueryDef("IsAdminQ", _
                                       "SELECT IsAdmin " & _
                                       "FROM LoginInfoT " & _
                                       "WHERE EmployeeID = " & LoginCmBx.Value)

Exit_LoginBtn_Click:
DoCmd.Close acForm, "LoginF", acSaveNo
        DoCmd.OpenForm "MenuF"
   Exit Sub
Err_LoginBtn_Click:
   MsgBox Err.Description
   Resume Exit_LoginBtn_Click

    Else
      MsgBox "Password Invalid. Please Try Again", vbOKOnly, _
            "Invalid Entry!"
        Me.PasswordTxt.SetFocus
    End If

End Sub

这样做是检查您是否选择了用户名,如果没有,则会发出错误告诉用户选择一个用户名。如果您这样做,它会检查您是否输入了密码。如果他们没有,它会发出另一个错误,说他们没有输入密码。如果他们同时选择了这两个密码,并且密码与表格中的密码不匹配,则表示您输入的密码错误。如果您输入了所选用户名的密码,它会将您登录。然后它会关闭您当前的表单,然后打开一个名为" MenuF"它还会在您选择的用户名下创建一个包含少量信息的查询,无论是否是管理员。我们还没有创建MenuF,所以让我们快速完成。虽然我们还没有完成LoginF,所以请准备好以后再回来!

创建表单,然后放下一个按钮。这是您的菜单表单,您可以创建任意数量的按钮,您可以创建其他表单,甚至只需在此处放置子表单并拥有整个数据库。您放下的Taht按钮,您可以将文本命名为您想要的任何内容。我把我当作退出。将按钮命名为MenuLogOutBtn。进入事件选项卡,然后在On Click脚本单击代码下,在以下位置输入:

Private Sub MenuLogOutBtn_Click()
   DoCmd.DeleteObject acQuery, "IsAdminQ"
           DoCmd.OpenForm "LoginF"
           DoCmd.Close acForm, "MenuF", acSaveNo
End Sub

这样做是删除登录按钮创建的查询,再次打开登录表单,然后关闭菜单。简单!

现在我需要你扔掉一个复选框,并将其命名为MyCheckbox。此框不需要特殊编码或控制源。虽然我建议将可见的更改为no,并删除随之附带的文本。

现在,转到表单的事件属性,然后在Open脚本下转到代码并输入:

Private Sub Form_Open(Cancel As Integer)

  Me.MyCheckbox.Value = GetLoginStateIsAdmin()

  If GetLoginStateIsAdmin = True Then
Me.ShortcutMenu = True
DoCmd.ShowToolbar "Ribbon", acToolbarYes
DoCmd.ShowToolbar "Menu Bar", acToolbarYes
Application.SetOption "ShowWindowsinTaskbar", True
DoCmd.SelectObject acTable, , True
  Else
Me.ShortcutMenu = False
DoCmd.ShowToolbar "Ribbon", acToolbarNo
DoCmd.ShowToolbar "Menu Bar", acToolbarNo
Application.SetOption "ShowWindowsinTaskbar", False
DoCmd.NavigateTo "acNavigationCategoryObjectType"
DoCmd.RunCommand acCmdWindowHide
  End If

End Sub

这样做的是复选框附加到查询IsAdmin列的信息,并为GetLoginStateIsAdmin提供该布尔变量。执行此操作后,它会启动一个简单的If语句,如果您不是管理员,则会关闭菜单栏并禁用右键单击;如果是,它允许您右键单击并且所有菜单栏都可见。

虽然如果你还没注意到,我们的复选框还没有从查询中获取信息!哦不!

第3步:创建公共模块

如果你的脚趾,你会注意到即使登录代码在这一点上也不起作用。首先,我们需要一些公共模块。转到功能区中的“创建”选项卡,然后创建一个模块。在下面输入:

    Public EmployeeID As Long

Save this module as LoginModule.

Create another module, and type this in:

    Function GetLoginStateIsAdmin()
    '
      Dim rst As DAO.Recordset

      Set rst = CurrentDb.OpenRecordset("IsAdminQ")
      GetLoginStateIsAdmin = Nz(rst(0), False)

      Set rst = Nothing
    '
    End Function

Save this one as GetAdmin.

Lets create one more module; so the user opening the database can't by bass stuff by using the shift key to launch it.

Type this in it:

Function ap_DisableShift()
'This function disable the shift at startup. This action causes
'the Autoexec macro and Startup properties to always be executed.

On Error GoTo errDisableShift

Dim db As DAO.Database
Dim prop As DAO.Property
Const conPropNotFound = 3270

Set db = CurrentDb()

'This next line disables the shift key on startup.
db.Properties("AllowByPassKey") = False

'The function is successful.
Exit Function

errDisableShift:
'The first part of this error routine creates the "AllowByPassKey
'property if it does not exist.
If Err = conPropNotFound Then
Set prop = db.CreateProperty("AllowByPassKey", _
dbBoolean, False)
db.Properties.Append prop
Resume Next
Else
MsgBox "Function 'ap_DisableShift' did not complete successfully."
Exit Function
End If

End Function

将其保存为ShiftModule。

我们完成了模块!让我们现在回到LoginF。

第4步:完成LoginF

转到表单的事件选项卡,然后单击加载脚本。单击代码,然后在以下位置键入:

Private Sub Form_Load()
   On Error Resume Next
   DoCmd.DeleteObject acQuery, "CustomerMoreInfoQ"
End Sub

这样做可确保在启动此表单时删除登录按钮创建的查询,以防用户在未注销的情况下关闭数据库。因此,如果您点击登录,则不会导致错误,因为查询仍然不存在。

第5步:测试它。

在表单视图中运行表单LoginF,然后选择Bob作为用户名。在密码文本框中输入密码1234,然后单击登录。它应该打开MenuF,你会看到所有菜单,你可以右键单击。好。现在,使用相同的密码注销并使用Stewert登录。现在您看到所有菜单都自行删除,您无法右键单击!耶!

为了更加安全,在LoginF的其他选项卡中,确保快捷菜单设置为否。这将设置右键单击以始终禁用;因为此时您还没有以用户身份登录。它不知道你是否是管理员。

第6步:在启动时禁用工具栏&在启动时启动LoginF。

转到文件>选项>当前数据库。

在“显示表单”下,选择“FormF”。 在“导航”部分下,取消选中“显示导航窗格”。

点击OK,然后返回LoginF;进入On Load代码并在End Sub:

之前添加它
DoCmd.ShowToolbar "Ribbon", acToolbarNo

你完成了!保存数据库,然后关闭它并再次打开它。它应该加载LoginF表单,你不能右键单击,没有菜单等。获取菜单编辑的唯一方法是登录管理员帐户!

第7步:扩展

虽然这并不会自动扩展您添加表单的次数。您需要将名为MyCheckbox的复选框(我建议复制+粘贴它)添加到您添加的每个表单中,并将此代码添加到您添加的每个表单中:

Private Sub Form_Open(Cancel As Integer)

  Me.MyCheckbox.Value = GetLoginStateIsAdmin()

  If GetLoginStateIsAdmin = True Then
Me.ShortcutMenu = True
  Else
Me.ShortcutMenu = False
  End If

End Sub

虽然一旦您对每个表单执行此操作,安全性仍然有效,您需要登录管理员帐户才能更改任何内容。如果您只是一个用户,您可以正常使用该表单(单击按钮,编辑子表单上的数据等)您不能自己编辑表单。