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

i86rm4rw  于 2023-01-20  发布在  Mysql
关注(0)|答案(8)|浏览(244)

我有一个mysql用户,我想授予他对一个数据库模式的所有READ权限。
一种方法是这样的:

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

是否有办法将所有读取操作分组到grant中?

z3yyvxxp

z3yyvxxp1#

如果有任何单一权限代表数据库上的所有读取操作。
这取决于你如何定义“全部阅读”。
从表和视图中“阅读”是SELECT权限。如果这就是您所指的“全部读取”,那么是的:

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

然而,听起来你指的是“看到”一切的能力,“看而不摸”的能力,所以,下面是我想到的其他类型的阅读:
“阅读”视图的定义是SHOW VIEW权限。
其他用户“阅读”当前正在执行的查询列表是PROCESS权限。
“阅读”当前复制状态是REPLICATION CLIENT权限。
请注意,根据所涉及用户的性质,其中任何一个或全部可能会公开比您打算公开的更多的信息。
如果这就是您想要读取的阅读,可以将其中任何一个(或the available privileges中的任何其他内容)组合到一个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语句和/或直接操作授予表本身。
this recent question on Database Administrators中,发布者希望非特权用户能够修改其他用户,这当然不是正常情况下可以做到的--根据定义,可以修改其他用户的用户不是非特权用户--然而,存储过程在这种情况下提供了一个很好的解决方案,因为它们使用DEFINER用户的安全上下文运行,从而允许对该过程具有X1 M8 N1 X特权的任何人临时承担提升的特权,以允许他们执行该过程完成的特定事情。

ccrfmcuu

ccrfmcuu2#

GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

这将创建一个对所有数据库(包括视图)具有SELECT权限的用户。

dsf9zpds

dsf9zpds3#

请注意,MySQL 8与此不同

你需要分两步来做:

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

pbpqsu0x4#

您可以授予用户的各种权限包括

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’;

我发现this文章非常有帮助

ozxc1zmp

ozxc1zmp5#

一步一步的指南,我发现here
为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或本地hosts文件解析。在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
x0fgdtte

x0fgdtte6#

甚至用户也得到了答案,@Michael - sqlbot在他的帖子中很好地涵盖了大部分要点,但有一点缺失,所以只是试图涵盖它。

如果要向简单用户(非管理员类型)提供读取权限-

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

注意:这里需要EXECUTE,这样如果有生成报告的存储过程(只有很少的选择语句),用户就可以读取数据。
将localhost替换为用户将从其连接到DB的特定IP。

其他读取权限为-

  • SHOW VIEW:如果要显示视图方案。
  • 复制客户:如果用户需要检查复制/从属状态。但需要给予所有数据库的权限。
  • 进程:如果用户需要检查正在运行的进程。将只适用于所有数据库。
rmbxnbpk

rmbxnbpk7#

如果您希望在授予读权限后视图是只读的,则可以在视图DDL定义中使用ALGORITHM = TEMPTABLE。

vmpqdwk3

vmpqdwk38#

**解决方案:**这里有一些在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

相关问题