【Mysql】数据控制语言(DCL)——Grant授权和Revote回收授权

数据控制,也就是分配权限
主要包括

  • 用户管理
  • 权限分配

开始学习数据控制之前,先了解mysql中的授权表和权限设置。

一、mysql中的授权表

mysql授权表一共涉及到5个表,分别是user、db、host、tables_priv和columns_priv。
这5张表的内容和用途如下:

表名功能
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。
db表db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表
host表host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。
tables_priv表tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。
columns_privcolumns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。

二、mysql中的权限

三、用户管理

创建用户

create user ‘用户名’@’允许其登录的地址’ identified by ‘密码’;

  • 创建的用户需同时指定该用户可以在哪个地址进行登录,“%”代表“任何地址”
  • 用户创建之后,自动在mysql的user表中添加了一条记录,但该用户还没有权限

修改用户密码

修改自己密码: set password = password(‘新密码’);

修改他人密码(必须有修改权限):
set  password  for  ‘用户名’@’允许其登录的地址’  = password(‘新密码’);

删除用户

drop user ‘用户名’@’允许其登录的地址’;

四、权限分配

增加权限

grant 权限名1, 权限名2, ... on 数据库名.对象名 to ‘用户名’@’允许其登录的地址’ identified by ‘密码’;

  • 权限名就是:‘select’,‘update’, ‘delete’等等,ALL/all privileges代表“所有权限”
    *.*表示所有数据中的所有对象
    某数据库名.*表示该数据库中的所有对象
  • identified by ‘密码’用于给一个用户在此时修改密码,不写就不修改密码
  • 该语句也可以创建用户(如果不存在),此时identified by '密码’必须写
eg.
mysql> grant all on *.* to wang@'192.168.1.150' identified by "password";           //all等同于all privilege,其中的privileges可以省略
mysql> grant all privileges on *.* to wang@'192.168.1.%' identified by "123456";    //192.168.1.%表示一个网段
mysql> grant insert,select on testdb.* to wang@'%' identified by "123456";
mysql> flush privileges;      //授权之后,需要手动更新权限表

查询权限

  1. 查询当前用户的权限
mysql> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
  1. 查询指定用户下的权限
mysql> show grants for wang@'192.168.1.%';           //可以在select user,host,password from mysql.user执行结果中找对应的权限用户信息
+---------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.1.%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
| GRANT SELECT, INSERT ON `testdb`.* TO 'wang'@'192.168.1.%'                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

删除权限

revoke 权限名1,权限名2, .... on 数据库名.对象名 from ‘用户名’@’允许其登录的地址’;
表示从某个用户身上“取消”某些权限(也许还保留了其他权限)

eg.
mysql> revoke create on test.test from 'user1'@'%';
mysql> flush privileges;

刷新权限

权限更改后,手动刷新权限

mysql> flush privileges;

注意事项

  • grant, revoke用户权限后,该用户只有重新连接MySQL数据库,权限才能生效
  • 如果想让授权的用户,也可以将这些权限grant给其他用户,那么授权时需添加选项 “with grant option”
    如下设置后,那么这个wang用户连接mysql后也可以将这些权限授予其他用户
mysql> grant insert,select on testdb.* to wang@'%' identified by "123456" with grant option;
  • 如果给用户设置的权限过大,既可以用revoke取消权限,也可以使用grant重新赋权,覆盖之前的密码
    不过,grant授权后的密码是密文形式保存的,如果记不住之前授权时的密码,那么怎样保证覆盖后的权限跟之前的权限一致?
    grant授权操作中其实不仅可以设置明文密码,也可以设置密文密码,如下:
1)grant 权限列表 on 库.表.* to 用户名@'ip' identified by "明文密码"
2)grant 权限列表 on 库.表.* to 用户名@'ip' identified by password "密文密码"

也就是说:
在grant重置权限的时候可以用查看的密文密码当做新的密码,然后去覆盖之前的权限,这就保证了修改前后的密码一致!

mysql> show grants for wang@'192.168.1.%';
+---------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.1.%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F9S736C080819AD76DD' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `testdb`.* TO 'wang'@'192.168.1.%'                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> grant alter,select on testdb.* to wang@'192.168.1.%' identified by password '*678E2A46B8C71291A3915F9S736C080819AD76DD';
Query OK, 0 rows affected (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show grants for wang@'192.168.1.%';
+---------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.1.%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F9S736C080819AD76DD' |
| GRANT SELECT, ALTER ON `testdb`.* TO 'wang'@'192.168.1.%'                                                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

通常开发同事在让运维同事开通mysql权限时,他们会在自己本地mysql里生成一个密文密码,然后把这个密文密码给运维同事,运维同事在用这个密文密码进行授权,
那么授权的密码就只有开发同事自己知道了,其他人都不知道!比较安全的一种做法~

参考:
MySQL 操作命令梳理(4)-- grant授权和revoke回收权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值