MS Access 2007 - 识别用户并基于该限制访问数据

时间:2010-01-12 22:33:01

标签: ms-access authentication authorization ms-access-2007

考虑设置:

  • Ms Access Application拆分为前端和后端=两者都是本地MS Access
  • 前端仅由表单组成 - 它将是访问数据的唯一方式
  • 分发给每台用户计算机的前端副本(感谢this question的答案)

我需要实施以下方案:

  • 使用<访问应用程序的Ms 20个用户,
  • 为每个用户分配1到10个项目,
  • 当用户打开MS Access时,他应该只被呈现与他被分配到的项目相关的数据
  

例如,我们有用户:

     
      
  • John
  •   
  • 欧文
  •   
     

John被分配到项目A,B,D。   欧文到B,D

     

当John登录时,他只能看到数据   与项目A,B,D有关。当欧文   登录他只能看到B,D

     

John和Owen可以同时访问该应用程序

后端的相关表格

  • 用户
  • 项目
  • userProject - 将用户链接到多个关系中的项目。每个用户可以分配到一个或多个项目,一个或多个用户可以处理项目。

我在databasedev.co.uk上遇到this solution,它基本上使用隐藏的表单来存储当前用户的详细信息,然后使用它来过滤其他表单上的数据。

所以这是我的问题:

这是推荐的解决方案吗?还有更好的选择吗?我以为我可以使用前端的表而不是隐藏的表格。

3 个答案:

答案 0 :(得分:1)

编辑重新评论
我认为你没有理由不在后端维护一个用户表,用户可以用来过滤项目的项目连接表。

如果您使用网络名称(http://www.mvps.org/access/api/api0008.htm),则可以使用代码获取当前用户,可以将其存储到表单上的隐藏字段,这对于将表单设置为相关项目非常有用,或者您可以将名称存储到自定义数据库属性(http://wiki.lessthandot.com/index.php/Custom_Database_Properties_Creation_and_Use

以下代码适用于查找已登录用户的数量。

您可以使用提供程序特定的ADO架构。您需要传递有效的连接,例如:

  ADOUserList Currentproject.Connection


  Public Sub ADOUserList(oConn As ADODB.Connection)
  Dim rs As ADODB.Recordset
      Set rs = oConn.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
      Debug.Print rs.GetString
      rs.Close
  End Sub

更多信息:http://msdn.microsoft.com/en-us/library/aa155436.aspx

答案 1 :(得分:1)

我有一个类似的,如果稍微复杂一点的情况。就我而言,用户被分配到用户组,这些用户组对Access对象(表单,报表等)具有不同的权限。他们还拥有分配给他们的项目和首选项。表:

user

user_group

user_pref

project

user_project

但是,我仍然使用隐藏的表单(session)来保存有关当前登录用户的会话信息。例如:user_id,user_name,已分配项目的子表单,首选项(例如“当前项目”) )。

最后,模块basSession包含getset隐藏形式的任何会话信息所需的所有功能,例如gfSession_GetUserID()

HTH

答案 2 :(得分:0)

请注意,在您当前的设置中,无法使用“识别用户并基于此限制访问数据”的方法。如果所有数据都驻留在共享后端Access文件中,则用户只需打开后端数据库并浏览所有数据即可。实际限制用户访问数据的唯一方法是使用数据库服务器。

如果您想访问Access,我建议您为所有(重要)表创建查询,并在表单中使用这些查询。在查询中包含一个WHERE语句,该语句将输出限制为用户可以查看的内容。您可以通过在打开数据库时更改完整的SQL或在查询的WHERE部分中包含全局变量并将该变量设置为当前UserID来执行此操作。