通过触发器对表应用列权限

时间:2012-07-04 15:02:32

标签: mysql triggers relational-database

现在,我有一个名为members的表,其中包含的东西,它们以conact数据,bank数据分割.... 现在,管理员应该能够创建,更新,删除保存在另一个表中的用户,这些表只能访问管理员。用户应该获得自己的mysql用户帐户,管理员也应该能够设置权限,例如用户无法访问银行数据。
现在,我创建了一个触发器,用于创建和删除用户帐户。现在我想通过触发器应用权限,但我没有找到一个有希望的解决方案我已经考虑设置列权限,但如果我想添加一个列,我会有另一件事,我将不得不在这种情况下编辑。
我也讨论过1:1的关系,但我找不到工作代码。

还有其他解决方案吗?

1 个答案:

答案 0 :(得分:2)

简短回答:不要让您的用户直接访问数据库。他们永远不能连接。只有负责维护和操作的人员才能访问生产数据库。这是出于安全原因。几乎在每种情况下,信息都存储在数据库中,有一个应用程序控制所有访问,它处理实际的更新,并强制执行您选择的业务逻辑。

不要将数据与业务逻辑混合在一起。

有一些数据库系统,例如Oracle,它们擅长于存储并将大部分业务逻辑应用于数据库本身。但是,这适用于不同类型的应用程序,以及构建系统的不同方法。

MySQL并没有让所有这些工具变得简单。如果您尝试在触发器和存储过程和视图中编写应用程序逻辑,然后让用户直接访问数据库,那么当我告诉您自己正在为维护噩梦做好准备时,请相信我。

您在注册时最后一次获得直接数据库访问权限是什么时候? Twitter,Netflix,Groupon,Facebook - 您正在与基于Web的应用程序进行交互,该应用程序应用业务规则并代表您读取和写入数据到数据库中。

有许多工具可以让您更轻松地编写应用程序软件:调试,分析,代码和协作开发的源代码控制,单元测试,持续集成和部署工具。如果你试图将所有内容写入数据库,那么你将失去所有这些。

以下是一个如何运作的简单示例:

将权限系统构建为三个表:user,group,user_group。用户拥有您系统中的用户帐户,组拥有各种级别的访问权限,例如“admin”,“client”,“anonymous”等。组是您为用户分配访问级别的方式。

`CREATE TABLE `user` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(64) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 CREATE TABLE `group` (
  `group_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_group` (
  `user_id` int(10) unsigned NOT NULL,
  `group_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`user_id`,`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;`

现在定义一些组

`insert into `group` (name) values ('admin'), ('user'), ('anonymous');`

然后是用户,然后将其添加到管理员组:

`insert into user (email) values ('admin@yoursite.com');`
`insert into user_group (user_id,group_id) values (1,1);`

现在,此权限模型表明用户可以属于一个或多个安全组。您的应用程序将检查这些组并根据结果执行不同的操作。让我们看一些伪代码:

加载用户的群组:

class User {

  private $user_id;
  private $groups;
  private $db;

  function load_groups() {
    // query the database
    $result = $db->query("SELECT name FROM `group` g JOIN user_group ug USING (group_id) WHERE user_id={$this->user_id}");
    // save an array of group names
    while ($row = $result->fetchrow()) {
      $this->groups[] = $row['name'];
    }
  }

  function is_member($group) {
    if (in_array($group, $this->groups) {
      return true;  // user group includes this value
    }
    return false;  // user is not in the group
 }

现在,在您的应用程序中,您可能具有查看数据的功能,但根据用户的组,它会产生不同的结果:

function display_data($user_object) {
   display_basic_data();   // everyone sees the basic data
   if ($user_object->is_member('admin')) {  
     // if the user is an admin, then display bank data too
     display_bank_data();
   }
}

同样,修改数据的功能应验证用户是否有权更改内容。