【问题标题】:MySQL Database: Limit user access to data they createdMySQL 数据库:限制用户访问他们创建的数据
【发布时间】:2014-12-18 08:16:32
【问题描述】:

使用 C# 和 MySQL,是否可以创建个人用户帐户来访问数据库,并且只允许用户查看/修改/删除自己的数据?

【问题讨论】:

  • 我想这个想法是在强化应用程序,以防 C# 代码包含缺陷。因此,以用户身份建立数据库连接似乎是个好主意。我在这里看到的一个大问题是,您不能像这样轻松地汇集和重用数据库连接。用户 Joe 的连接不能被用户 Jane 重用。为每个用户请求建立连接可能代价高昂(即使应用程序和数据库在同一系统上运行),并且在处理大量并发请求时可能会完全停止服务器。

标签: c# mysql permissions


【解决方案1】:

在 SQL 中,您可以为用户或用户组授予对表和视图的所有 SIDU 访问类型(选择、插入、删除、更新)的权限。

如果您在行级别讨论更精细的粒度,我认为您需要将此信息存储在某个地方;最直接的方法是向您需要限制的每个表添加所有者字段和/或特权字段等内容。

另一种方法是创建一个或多个表,其中包含受限或非受限记录或内容的键,例如项目或区域..

如果您拥有精心设计的所有权和权限概念,并且对于现在和以后都足够灵活,那么第一个解决方案的代码编写起来并不难。

您将添加一个访问逻辑层,它添加一个额外的 where 子句,在最简单的情况下,例如:..AND WHERE table.ownerID = @ownerid 或类似的每个 SELECT。对于每个 INSERT,它都会用当前用户 ID 或组 ID 和/或他当前的访问权限填充该字段..

为用户组做计划,因为一个用户经常需要做另一个用户的工作,至少是部分工作..

额外的特权表需要更好的规划..

还要考虑管理这些数据的工具和功能。

更新

既然现在很清楚,您希望设置基于 Web 的数据访问,您可以使用用户名或哈希或加密版本为每个用户创建单独的表,用作每个表的前缀;或者,更常见的是,您可以再次为每个用户设置一个单独的数据库,数据库名称以某种方式从用户名或用户 ID 派生而来。

每个用户都有一个单独的数据库的版本更容易编写,因为登录后,每个用户的一切都将相同,即无需向 SQL 注入任何内容。

唯一可能的考虑可能是来自提供商的技术或金钱限制。一些包只允许少量的数据库。在这种情况下,表前缀方法是下一个最可能的解决方案。

因此,您期望的用户数量也可能是一个决定因素..

【讨论】:

  • 我还是有点困惑.. 基本上,使用用户获取我的软件的副本。在软件中,应该有一个创建用户按钮。该按钮应该创建一个名为“username_data”或其他名称的表。从那时起,该用户应该只能查询/修改/删除该表。他们不应该能够修改/查看/删除数据库中他们没有使用他们的用户名/密码创建的任何其他表。
  • 好的。这些用户分享了什么?同一个数据库?
  • 有人发表了评论,然后删除了他们的评论,但提到了“存储的例程”什么的。经过一番快速的谷歌搜索后,听起来我可以让某人以访客身份登录数据库,并且只能访问一个名为“创建用户”的存储例程,他们可以调用该例程来创建用户和表,这将是唯一的从那时起他们就可以接触到的东西……这有意义吗?
  • 是的,他们共享数据库,但可以将自己的表放入其中
  • 他们会使用相同的表格吗?在这种情况下,可以使用用户名或 id 为表添加前缀,例如:'bitwise_products' 等。并在所有 SQL 语句中使用前缀名称。我还不知道“存储例程”..
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2023-02-01
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多