实战未动,语法先行
1. 在MySQL中,拥有GRANT权限的用户才可以执行GRANT语句,其语法格式如下:
GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user[IDENTIFIED BY [PASSWORD] 'password']] ... [WITH with_option [with_option]...]
- priv_type 参数表示权限类型;
- columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表;
- database.table 用于指定权限的级别;
- user 参数表示用户账户,由用户名和主机名构成,格式是“'username'@'hostname'”;
- IDENTIFIED BY 参数用来为用户设置密码;
- password 参数是用户的新密码。
2. WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:
- GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
- MAX_QUERIES_PER_HOUR count:设置每个小时可以允许执行 count 次查询;
- MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行 count 次更新;
- MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立 count 个连接;
- MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的 count 个连接。
3. MySQL 中可以授予的权限有如下几组:
- 列权限,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 name 列的值的权限。
- 表权限,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。
- 数据库权限,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
- 用户权限,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。
4. 对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:
- *:表示当前数据库中的所有表。
- *.*:表示所有数据库中的所有表。
- db_name.*:表示某个数据库中的所有表,db_name 指定数据库名。
- db_name.tbl_name:表示某个数据库中的某个表或视图,db_name 指定数据库名,tbl_name 指定表名或视图名。
- db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name 指定存储过程名或函数名。
权限类型那点事
1. 授予数据库权限时,<权限类型>可以指定为以下值:
因笔者比较懒,上面截图是直接摘自互联网,如有侵权请告知,将会在第一时间删除。
2. 授予表权限时,<权限类型>可以指定为以下值:
因笔者比较懒,上面截图是直接摘自互联网,如有侵权请告知,将会在第一时间删除。
3. 授予列权限时
<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list。
4. 最有效率的权限是用户权限。
授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:
- CREATE USER:表示授予用户可以创建和删除新用户的权限。
- SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。
原理略懂,直接开干(实战)
1. 创建用户并授权
- 注意,mysql8或以上版本已经废弃了grant的一个特性:如果权限被授予给一个不存在的用户,MySQL 会自动执行一条 CREATE USER 语句来创建这个用户,但同时必须为该用户设置密码。(注意,该特性已在mysql8或以上版本废弃了)
mysql> CREATE USER 'ttr2'@'%' IDENTIFIED BY 'ttr2'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'ttr2'@'%' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES;
2. 查看用户权限
# 查看普通用户权限,方式1 mysql> show grants for ttruser1@localhost; +----------------------------------------------+ | Grants for ttruser1@localhost | +----------------------------------------------+ | GRANT USAGE ON *.* TO `ttruser1`@`localhost` | +----------------------------------------------+ # 查看普通用户权限,方式2 mysql> select * from mysql.user where user="ttruser1" and host="localhost"\G; # 查看root用户权限 mysql> show grants for root@localhost\G;
- 新创建的普通用户默认是没有任何权限,只能登录进去
- 查看刚创建完的用户,查看权限,USAGE ON *.*表示该用户对任何数据库和任何表都没有权限。
3. 给用户授权(各种场景)
- 授权所有权限给ttr1@localhost用户(已经和root权限是一样的,也可以说ttr1也是额外的管理员了)
grant all privileges on *.* to ttr1@localhost; # 或 grant all on *.* to ttr1@localhost; # 或 grant super on *.* to ttr1@localhost;
- 授予具体的查权限(select)给tantianran用户
grant select on *.* to tantianran@localhost;
- 让用tantianran只能查zabbixdb库的hosts表里的name字段
grant select(name) on zabbixdb.hosts to tantianran@localhost;
- 允许root用户可远程连接到mysql数据库
# 查看 mysql> select user,host from mysql.user; +------------------+----------------+ | user | host | +------------------+----------------+ | zabbix | % | | syn_a | 192.168.11.152 | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | # 可以看到root用户的当前主机配置信息为localhost +------------------+----------------+ 6 rows in set (0.00 sec) # 修改Host为通配符% update mysql.user set host='%' where user='root'; # Host修改完成后记得执行flush privileges使配置立即生效 flush privileges; # 修改root账户的密码,并将加密方法由caching_sha2_password修改为mysql_native_password ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root.123456';
知识拓展:Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1。这里的意思就是说root用户只 能通过192.168.1.1的客户端去访问。user=root Host=localhost,表示只能通过本机客户端去访问。而 % 是个 通配符 ,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连 接。如果 Host=% ,表示所有IP都有连接权限。注意:在生产环境下不能为了省事将host设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的IP进行设置。
4. 回收用户权限
revoke all privileges on *.* from tantianran@localhost; # 回收所有权限 revoke select on *.* from tantianran@localhost; # 回收掉具体的权限
写在最后
本篇只是简单剖析,后续笔者抽空再来一次更深入、更彻底的剖析。时间有限,就此搁笔。望多多关注、点赞、转发!