数据控制,也就是分配权限
主要包括
- 用户管理
- 权限分配
开始学习数据控制之前,先了解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_priv | columns_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; //授权之后,需要手动更新权限表
查询权限
- 查询当前用户的权限
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)
- 查询指定用户下的权限
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里生成一个密文密码,然后把这个密文密码给运维同事,运维同事在用这个密文密码进行授权,
那么授权的密码就只有开发同事自己知道了,其他人都不知道!比较安全的一种做法~