MySQL权限工作原理
mysql是如何来识别一个用户
mysql为了安全性考虑,采用 主机名+用户名 来判断一个用户的身份,因为在互联网中很难通过用户名来判断一个用户的身份,但是我们可以通过ip或者主机名判断一台机器,某个用户通过这个机器过来的,我们可以识别为一个用户,所以mysql中采用用户名+主机名来识别用户的身份。当一个用户对mysql发送指令的时候,mysql就是通过用户名和来源(主机)来断定用户的权限。
- 阶段1:连接数据库,此时
mysql会根据你的用户名及你的来源(ip或者主机名称)判断是否有权限连接; - 阶段2:对
mysql服务器发起请求操作,如create table、select、delete、update、create index等操作,此时mysql会判断你是否有权限操作这些指令
权限生效时间
用户及权限信息放在库名为mysql的库中,mysql启动时,这些内容被读进内存并且从此时生效,所以如果通过直接操作这些表来修改用户及权限信息的,需要 重启mysql或者执行flush privileges;才可以生效。
用户登录之后,mysql会和当前用户之间创建一个连接,此时用户相关的权限信息都保存在这个连接中,存放在内存中,此时如果有其他地方修改了当前用户的权限,这些变更的权限会在下一次登录时才会生效。
管理员常用命令
-- 查看所有用户
use mysql;
select user,host from user;
-- 创建用户 create user 用户名[@主机名] [identified by '密码'];
create user 'maomao'@'%' identified by 'maomao';
/*
说明:
1. 主机名默认值为%,表示这个用户可以从任何主机连接mysql服务器
2. 密码可以省略,表示无密码登录
*/修改密码【4种方式】
-- 方式1:管理员修改密码
SET PASSWORD FOR '用户名'@'主机'= PASSWORD('密码');
mysql> set password for 'maomao'@'%' = 'maomao1';
-- 方式2:create user 用户名[@主机名] [identified by '密码']; 登录当前用户后修改
set password = password('密码');
-- 方式3:修改mysq.user表修改密码() MySQL 5.7.6及以上版本中,password() 函数已被移除。
use mysql
update user set authentication_string = password('321') where user ='test1' and host ='%';
flush privileges;
-- 方法4: 推荐使用
ALTER USER 'maomao'@'%' IDENTIFIED BY 'maomao1';用户授权
grant privileges ON database.table TO 'username'[@'host'] [with grant option]
-- 示例
grant select,update on seata.* to 'test1'@'%';
-- 查看用户权限
show grants for 'root'@'localhost';
-- 查看当前用户
show grants;grant命令说明:
- priveleges (权限列表),可以是
all,表示所有权限,也可以是select、update等权限,多个权限之间用逗号分开。 - ON 用来指定权限针对哪些库和表,格式为
数据库.表名,点号前面用来指定数据库名,点号后面用来指定表名,*.*表示所有数据库所有表。 - TO 表示将权限赋予某个用户, 格式为
username@host,@前面为用户名,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。 - WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。 备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。
撤销用户权限
revoke privileges ON database.table FROM '用户名'[@'主机'];删除用户
drop user '用户名'[@‘主机’]
-- 示例
drop user 'maomao'@'%';
delete from user where user='用户名' and host='主机';
flush privileges;授权原则说明
- 只授予能满足需要的最小权限,防止用户干坏事,比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限;
- 创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段;
- 初始化数据库的时候删除没有密码的用户,安装完数据库的时候会自动创建一些用户,这些用户默认没有密码;
- 为每个用户设置满足密码复杂度的密码;
- 定期清理不需要的用户,回收权限或者删除用户。