Mysql-如何授予用户只读权限?

我有一个 mysql 用户,我想授予他对 db 模式的所有 READ 权限。

一种方法是:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

有没有办法将所有读操作分组到 Grant 中?

221718 次浏览
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

这将为包括视图在内的所有数据库创建具有 SELECT特权的用户。

如果有任何特权代表数据库上的所有 READ 操作。

这取决于你如何定义“全部阅读”

从表格和视图中“阅读”是 SELECT的特权。如果这就是你所说的“全部阅读”的意思,那么是的:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

然而,听起来你的意思是“看到”一切的能力,“只看不摸”的能力所以,这里是我脑海中浮现的其他类型的阅读材料:

“阅读”视图的定义是 SHOW VIEW特权。

“读取”其他用户当前正在执行的查询列表是 PROCESS特权。

“读取”当前复制状态是 REPLICATION CLIENT特权。

请注意,根据所涉及的用户的性质,其中任何一个或所有这些可能会公开比您打算公开的更多的信息。

如果这就是你想要做的阅读,你可以在一个单一的 GRANT语句中结合任何这些(或任何其他的 可用的特权)。

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

但是,没有一个特权可以授予其他特权的某个子集,这听起来就像您要求的那样。

如果你正在手动做事情,并寻找一个更简单的方法来完成这件事,而不需要记住你通常为某个类别的用户做出的具体授权,你可以查找语句来重新生成一个类似的用户的授权,然后修改它来创建一个拥有类似权限的新用户:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

更改“ not _ leet”和“ localhost”以匹配要添加的新用户以及密码,将导致创建新用户的可重用 GRANT语句。

的,如果您希望单个操作设置并向用户授予有限的特权集,或者删除任何不合格的特权,可以通过创建一个存储过程来完成,该存储过程封装了您想要做的所有事情。在过程的主体中,您可以使用动态 SQL 构建 GRANT语句,并且/或者直接操作授予表本身。

关于数据库管理员的最新问题中,发布者希望非特权用户能够修改其他用户,这当然不是通常可以做到的事情——一个能够修改其他用户的用户,根据定义,不是非特权用户——然而,存储过程在这种情况下提供了一个很好的解决方案,因为它们与其 DEFINER用户的安全上下文一起运行,允许任何在该过程中拥有 EXECUTE特权的人暂时承担升级的特权,以允许他们做该过程完成的特定事情。

如果希望仅在授予读权限后才读取视图,可以在视图 DDL 定义中使用 ALGORITHM = TEMPTABLE。

一步一步的指导我发现 给你

为 MySQL 创建只读数据库用户帐户

在 UNIX 提示符下,运行 MySQL 命令行程序,并通过键入以下命令作为管理员登录:

mysql -u root -p

键入 root 帐户的密码。 在 mysql 提示符下,执行下列步骤之一:

若要让用户从任何主机访问数据库,请键入以下命令:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

如果收集器将安装在与数据库相同的主机上,请键入以下命令:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

此命令使用户只能从本地主机对数据库进行只读访问。 如果您知道将安装收集器的主机名或 IP 地址,请键入以下命令:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

主机名必须可以通过 DNS 或本地主机文件解析。 在 mysql 提示符下,键入以下命令:

flush privileges;

类型 quit

以下是示例命令和确认消息的列表:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

可以授予用户的各种权限如下

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

要向特定用户提供权限,可以使用以下框架:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

我发现 这个的文章很有帮助

甚至用户也得到了答案,@Michael-sqlbot 在他的帖子中大部分内容都很好地覆盖了,但是有一点没有覆盖到,所以尽量去覆盖它。

如果希望向简单用户提供读权限(不是管理类型)-

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

注意: 这里需要 EXECUTE,这样如果存在生成报告的存储过程(只有很少的选择语句) ,用户就可以读取数据。

将 localhost 替换为特定的 IP,用户将从该 IP 连接到 DB。

附加读取权限如下-

  • 显示视图: 如果要显示视图架构。
  • 复制客户端: 如果用户需要检查复制/从状态。 但需要得到所有数据库的许可。
  • 进程: 如果用户需要检查运行进程。将与所有 只杀死尸。

注意,对于 MySQL8它是不同的

你需要分两步来做:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;

解决方案: 这里有一些在 mysql 上创建只读用户的有用的烹饪书。

# 1. connect as an admin on database / cluster
mysql -u root -h  mydb.123456789012.us-east-1.rds.amazonaws.com


# 2. create user protected with strong password with global access ('%') or local access ('localhost')
mysql> CREATE USER 'ro_user'@'%' IDENTIFIED BY 'abcd1234%^&#';


# 3. grant SELECT privileges for relevant user
mysql> GRANT SELECT ON *.* TO 'ro_user'@'%' WITH GRANT OPTION;


# 4. reload grant tables on database
mysql> FLUSH PRIVILEGES;


# 5. verify grant are placed as expected
mysql> show grants for 'ro_user'@'%';


// output:
// +------------------------------------------------------+
// | Grants for ro_user@%                                   |
// +------------------------------------------------------+
// | GRANT SELECT ON *.* TO 'ro_user'@'%' WITH GRANT OPTION |
// +------------------------------------------------------+
// 1 row in set (0.00 sec)


mysql> exit