我们经常能在网上看见删库跑路的段子,直接使用root用户来操作数据库无疑危险的。实际生产环境中,一般由DBA掌握root用户权限,给其他人都是一个赋予只读的普通用户权限。下面就让我们来看看MySQL的用户权限的设计吧。
MySQL用户
MySQL以(用户名+主机名)来标识一个用户,有以下几种类型
类型 | 例子 | 含义 |
---|---|---|
用户名+ip | 'test'@'192.168.2.100' | 仅该ip才能用test登录 |
用户名+ip段 | 'test'@'192.168.2.%' | 仅该ip段才能用test登录 |
用户名+域名 | 'test'@'localhost' | 仅该域名才能用test登录 |
用户名+% | 'test'@'%' | 任意主机都能通过test登录 |
用户授权
授权格式: 【grant 权限 on 数据库.数据表 to 用户 IDENTIFIED by 登录密码】
可以授权多次,每一次的授权都会与前一次叠加到一起。
-- 授权用户forum数据库的select权限
grant SELECT on forum.* to 'test'@'192.168.2.100' IDENTIFIED by '123456';
-- 授权用户forum数据库的update,insert权限
grant insert,UPDATE on forum.* to 'test'@'192.168.2.100';
-- 授权用户所有数据库的所有权限
grant all privileges on *.* to 'test'@'192.168.2.100';
-- 每次修改后记得重新刷新用户权限
FLUSH PRIVILEGES;
-- 查看赋予的用户权限
show grants for 'test'@'192.168.2.100';
权限具体可以参考MySQL的官方文档
删除用户授权
-- 同时删除用户与权限
drop user 'test'@'192.168.2.100';
-- 删除用户的某一权限
REVOKE INSERT on forum.* from 'test'@'192.168.2.100';
数据表字段权限控制
MySQL的权限控制粒度,可以达到用户只对数据表的某些字段拥有权限
-- 控制只对id与username字段拥有select权限,这时select *会报错。
grant select(id,username) on forum.`user` to 'dev'@'192.168.2.100' IDENTIFIED by '123456';
-- 控制只对id与username字段拥有update权限
grant UPDATE(id,username) on forum.`user` to 'dev'@'192.168.2.100' IDENTIFIED by '123456';
-- 查看字段控制权限
SELECT * from mysql.columns_priv;