MySQL权限工作原理

mysql是如何来识别一个用户

mysql为了安全性考虑,采用 主机名+用户名 来判断一个用户的身份,因为在互联网中很难通过用户名来判断一个用户的身份,但是我们可以通过ip或者主机名判断一台机器,某个用户通过这个机器过来的,我们可以识别为一个用户,所以mysql中采用用户名+主机名来识别用户的身份。当一个用户对mysql发送指令的时候,mysql就是通过用户名和来源(主机)来断定用户的权限。

  1. 阶段1:连接数据库,此时mysql会根据你的用户名及你的来源(ip或者主机名称)判断是否有权限连接;
  2. 阶段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段;
  • 初始化数据库的时候删除没有密码的用户,安装完数据库的时候会自动创建一些用户,这些用户默认没有密码;
  • 为每个用户设置满足密码复杂度的密码;
  • 定期清理不需要的用户,回收权限或者删除用户。