12.1MySQL的权限
用户连接到MySQL,可以做各种查询,这都是MySQL用户与权限功能在背后维持着操作。
用户与数据库服务器交互数据,分为两个阶段:
(1)你有没有权连接上来
(2)你有没有权执行本操作
12.1.1你有没有权连接上来
服务器如何判断用户有没有权连接上来?
依据:
1)你从哪里来?host
2)你是谁?user
3)你的密码是多少?password
用户的这三个信息,存储在mysql库中的user表中。
修改host域,使IP可以连接
mysql>``update` `user` `set` `host=``'192.168.137.123'` `where` `user` `= ``'root'``;``mysql>flush ``privileges``; ``--冲刷权限
修改用户密码
mysql>``update` `user` `set` `password``=``password``(``'11111111'``) ``where` `xxx;``mysql>flush ``privileges``; ``--冲刷权限
12.1.2你有没有权执行本操作
在mysql中,有一个库是mysql库,在这个库中有三个表,一个是user表,user表中存储了所有用户的权限信息。一个是db表,db表存储的是所有用户在数据库层的权限信息。一个是tables_priv表,tables_priv表存储的是所有用户在表层的权限信息。
用户登录,user表首先能限制用户登录,其次还保存了该用户的全局权限,如果该用户没有任何权限,那么将从db表中查找该用户是否有某个数据库的操作权限,如果都没有,将从table_priv表中查找该用户是否有某个表的操作权限,如果有,则该用户可以按照已有的权限来操作该表。
12.2创建MySQL的用户
命令:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
说明:
username:你将创建的用户名.
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%代替host。
password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器。
关于创建用户时提示“Operation CREATE USER failed for XXX”的解决办法:
出现该原因的结果有可能是你使用了
delete from mysql.user where user ='user_1';
的语句删除用户,即使你刷新了 flush privileges;也没用。
删除用户需要使用
drop user 用户
然后重新进行创建就好了:
create user 'user_1'@'%' identified by '123456';
12.3用户授权
12.3.1授权命令格式
GRANT privileges ON databasename.tablename TO 'username'@'host';
privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL;
databasename:数据库名;
tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*;
例子:
GRANT SELECT, INSERT ON test.user TO 'user_1'@'%';
GRANT ALL ON *.* TO 'user_1'@'%';
GRANT ALL ON maindataplus.* TO 'user_1'@'%';
注意:
用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
12.3.2使用REVOKE命令可以回收授予的权限,语法格式如下:
REVOKE priv_type ON {表名|数据库名} FROM 用户;
注:只有拥有当前数据库全局CREATE或者UPDATE权限的用户才能使用REVOKE命令。
12.3.3全局授权和收回
全局授权格式(使用通配符*):
grant` `[权限1,权限2,权限3] ``on` `*.* ``to` `user``@``'host'` `identified ``by` `'password'
常用权限:all、create、drop、select、insert、delete、update
授权:
创建lisi用户,host为192.168.191.%,%通配符表示192.168.191.xxx结尾的主机都可以连接,密码为12345678。
grant` `all` `on` `*.* ``to` `lisi@``'192.168.191.%'` `identified ``by` `'12345678'``;
收回权限:
revoke` `all` `on` `*.* ``from` `lisi@``'192.168.191.%'``;
12.3.4数据库级授权和收回
需求:让lisi用户拥有mysqlmaster数据库的所有操作权限
授权:
grant` `all` `on` `mysqlmaster.* ``to` `lisi@``'192.168.191.%'` `identified ``by` `'12345678'``;
收回:
revoke` `all` `on` `mysqlmaster.* ``from` `lisi@``'192.168.191.%'``;
12.3.5表级授权和收回
需求:让lisi用户具有mysqlmaster数据库下的goods表的insert、update、select三个操作的权限。
授权:
grant` `insert``,``update``,``select` `on` `mysqlmaster.goods ``to` `lisi@``'192.168.191.%'` `identified ``by` `'12345678'``;
收回:
revoke` `insert``,``update``,``select` `on` `mysqlmaster.goods ``from` `lisi@``'192.168.191.%'``;
12.4更新用户语法格式如下:
12.4.1如果是修改当前登录用户密码语法:
SET PASSWORD FOR 用户=PASSWORD(‘新密码’);
12.4.2通过修改mysql数据库下的user表中的来修改(不可取)
命令和update普通表一样,语法格式如下:
UPDATE MYSQL.USER SET 属性名= 新属性值 WHERE 条件;
比如,修改User的用户名为“user_1”将其用户名改为“user_3”,密码改为“1234”。
注意:MySQL8之前修改密码是 set password= password("新密码");而MySQL8是 set authentication_string = "新密码".也就是MySQL8的密码字段为authentication_string 。
update mysql.user set user ="user_3" ,authentication_string ="1234" where user ="user_1";
可以发现如果直接使用 set authentication_string ='新密码',那么该密码直接被填充到用户中而没有经过加密。而我们知道,MySQL的密码是经过加密的,因此这样子使用update修改密码是有问题的,在你登录时候虽然用户名和密码都正确,但是却没法进行登录,会提示“ Access denied for user 'user_3'@'117.154.88.249' (using password: YES)”。
MySQL8.0后请使用alter修改用户密码,因为在MySQL8.0以后的加密方式为caching_sha2_password,如果使用update修改密码会给user表中root用户的authentication_string字段下设置newpassowrd值,当再使用alter user 'root'@'localhost' identified by 'newpassword'修改密码时会一直报错,必须清空后再修改(如果不首先清空这个authentication_string,在使用alter user 进行修改时会发生“Operation ALTER USER failed for XXX”的提示)
因为authentication_string字段下只能是MySQL加密后的43位字符串密码,其他的会报格式错误,所以在MySQL8.0以后能修改密码的方法只能是使用alter来修改:
ALTER USER 用户 IDENTIFIED WITH mysql_native_password BY '新密码';
#或者是
ALTER USER 用户 IDENTIFIED BY ‘新密码’;
比如:将用户 ‘user_1’@‘%’ 的密码改为“1234”
ALTER USER ‘user_1’@‘%’ IDENTIFIED BY ‘1234’;
#或者
ALTER USER ‘user_1’@‘%’ IDENTIFIED WITH mysql_native_password BY '1234';
最后刷新一定要刷新下
flush privileges;
12.5查询某个用户权限
show grants for 用户;
比如:
show grants for 'user_1'@'%';
12.6删除用户
12.6.1使用drop命令
drop user 用户;
比如:
drop user 'user_1'@'%';
删除的是 用户 'user_1'@'%'。
12.6.2使用delete命令
delete from mysql.user where 条件
比如:
delete from mysql.user where user='user_1' and host ='%';
删除的是 用户 'user_1'@'%'。
12.6.3使用drop和delete命令的区别
12.6.3.1drop user 用户名;
删除已经存在的用户,例如要删除‘user_1’这个用户,(drop user 'user_1';)默认删除的是user_1@”%”这个用户,如果还有其他用户,例如user_1@”localhost”,user_1@”ip”,则不会一起被删除。如果只存在一个用户'user_1'@”localhost”,使用语句(drop user 'user_1';)会报错,应该用(drop user 'user_1'@”localhost”;)如果不能确定(用户名@机器名)中的机器名,可以在mysql中的user表中进行查找,user列对应的是用户名,host列对应的是机器名。
12.6.3.5 delete from user where user=”用户名” and host=”localhost”;
delete也是删除用户的方法,例如要删除'user_1'@”localhost”用户,则可以
delete from user where user=”user_1” and host=”localhost”;
drop删除掉的用户不仅将user表中的数据删除,还会删除诸如db和其他权限表的内容。而(delete from mysql.user)只是删除了mysql数据库中user表的内容,其他表不会被删除,后期如果命名一个和已删除用户相同的名字,权限就会被继承。
12.7测试用例
12.7.1.创建用户user_1和user_2,密码都为123456
create user 'user_1'@'%' identified by "123456";
create user 'user_2'@'%' identified by "123456";
12.7.2.将用户user_2的名称修改为user_3,并将其密码修改为1234
首先使用update mysql.user语句来更新user_2中的用户名
update mysql.user set user ='user_3' where user ='user_2' and host='%';
然后使用alter命令修改密码:
alter user 'user_3'@'%' identified with mysql_native_password by '1234';
这样就能完成将user_2表改为user_3表并且修改对应的的代码了。
12.7.3.以user_1身份登陆数据库
从可以发现可以远程登录了。
12.7.4.授予用户user_1对DBEM数据库中employee表的查询、插入、修改、删除等权限。
grant insert,update,select,delete on dbms.employee to 'user_1'@'%';
12.7.5.授予用户user_1对salary表的查询权限,并允许其将权限授予其他用户,然后用user_1登陆数据库并将salary表的查询权限授予user_3。
首先给与user_1对salary表的查询权限并允许其将权限授予其他用户:
grant select on dbms.salary to 'user_1'@'%' with grant option;
然后使用user_1的用户名和密码登录user_1进入数据库中,并将对salary表的查询权限给user_3:
grant select on dbms.salary to 'user_3'@'%';
12.7.7.回收user_1的employee表上的select权
revoke select on dbms.employee from 'user_1'@'%';
可以发现,user_1上的表的select权限已经被收回了。