现在,我有一个名为members的表,其中包含的东西,它们以conact数据,bank数据分割....
现在,管理员应该能够创建,更新,删除保存在另一个表中的用户,这些表只能访问管理员。用户应该获得自己的mysql用户帐户,管理员也应该能够设置权限,例如用户无法访问银行数据。
现在,我创建了一个触发器,用于创建和删除用户帐户。现在我想通过触发器应用权限,但我没有找到一个有希望的解决方案我已经考虑设置列权限,但如果我想添加一个列,我会有另一件事,我将不得不在这种情况下编辑。
我也讨论过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();
}
}
同样,修改数据的功能应验证用户是否有权更改内容。