mysql对用户的权限控制分为两个阶段:
- 有没有权限连接
- 有没有权限执行此操作(select,update…)
判断用户是否有权连接,根据三个参数来判断:
- 你从哪儿来 host
- 你是谁 user
- 你的密码是什么 password
用户的这三个信息,存储在 mysql.user 表中:
use mysql;
# 5.7 password为authentication_string
select host, user, authentication_string from user;
为什么需要host验证:当有人知道了你的用户名和密码,但是host验证不通过时,仍然不可以连接,保证了安全性。
修改host域名,让指定的ip可以连接:
update user set host='你要授权的ip' where user = 'root';
# 刷新权限,否则不生效,因为权限信息在内存中
flush privileges;
# 此时,客户端ip为 localhost的用户不可以连接了,除了指定的客户端ip
% 代表任意用户
192.168.0.x 代表局域网内的用户可以登陆
注意 mysql -h 参数指定的是服务器的地址,和权限验证没有关系
修改密码:
update mysql.user set authentication_string=password('新密码') where user='root';
# 刷新权限,否则不生效,因为权限信息在内存中
flush privileges;
-- 较早的版本使用password字段
创建并授权用户:
grant [权限1,权限2,权限3..] on *.* to user@'host' identified by 'password';
*.* 代表所有库的所有表
常用权限:
all 所有权限,范围很大
create
drop
insert
delete
update
select
收回用户权限:
revoke [权限1,权限2,权限3..] on *.* from user@'host';
flush privileges;
库的授权:
-- 针对某个库授权
grant all on 数据库名.* to 用户名@'host';
flush privileges;
表的授权:
-- 针对某个表授权
grant all on 数据库名.表明 to 用户名@host;
flush privileges;
表的权限可以做什么?
在开发中,某些表的数据是原始数据,不能被删除。
mysql 的 权限控制可以控制到列
注意
user -> db -> tables_prv
- user 全局控制,控制用户登陆、控制select、update、..等
- db 判断用户有没有某个库的操作权
- tables_priv 判断用户有没有table的权限