MySQL权限工作原理
用户识别方式
MySQL为了安全性考虑,采⽤主机名+⽤户名来判断⼀个⽤户的⾝份,因为在互联⽹中很难通过⽤户名来判断⼀个⽤户的⾝份,但是我们可以通过IP或者主机名判断⼀台机器,某个⽤户通过这个机器过来的,我们可以识别为⼀个⽤户,所以MySQL中采⽤⽤户名+主机名来识别⽤户的⾝份。当⼀个⽤户对MySQL发送指令的时候,MySQL就是通过⽤户名和来源(主机)来断定⽤户的权限。
权限验证方式
- 阶段1:连接数据库,此时MySQL会根据你的⽤户名及你的来源(IP或者主机名称)判断是否有权限连接
- 阶段2:对MySQL服务器发起请求操作,如CREATE TABLE、SELECT、DELETE、UPDATE、CREATE INDEX等操作,此时MySQL会判断你是否有权限操作这些指令
权限生效时间
⽤户及权限信息放在库名为mysql的库中,MySQL启动时,这些内容被读进内存并且从此时⽣效,所以如果通过直接操作这些表来修改⽤户及权限信息的,需要重启MySQL或者执⾏FLUSH PRIVILEDGE;才可以⽣效。⽤户登录之后,MySQL会和当前⽤户之间创建⼀个连接,此时⽤户相关的权限信息都保存在这个连接中,存放在内存中,此时如果有其他地⽅修改了当前⽤户的权限,这些变更的权限会在下⼀次登录时才会⽣效。
创建和删除用户及管理用户权限
用户信息存储在mysql数据库下的user表中,表中User字段表示用户名,Host字段表示主机名,authcation_string字段表示登录密码。
可使用CREATE USER 和DROP USER来创建和删除用户,也可通过直接操纵表的方式来创建和删除用户
-
查看MySQL中所有用户信息
-
通过CREATE USER创建
CREATE USER常用语法如下,详细语法可通过help CREATE USER命令查看。
CREATE USER <用户名>[@<主机名>] IDENTIFIED BY '<密码>';
示例:
-
修改用户密码
-
通过SET PASSWORD 指令修改
SET PASSWORD指令语法如下
SET PASSWORD [FOR <用户名@主机名>] auth_option [REPLACE '<当前密码>'] [RETAIN CURRENT PASSWORD];
其中auth_option: { = '<密码>'| TO RANDOM}
2. #### 通过操纵user表修改
注: 通过表修改需要FLUSH PRIVILEDGES或者重新登录才生效
-
查看用户权限
通过SHOW GRANTS命令查看,命令语法如下:
SHOW GRANTS [FOR <用户名@主机名>];
示例:
-
授予用户权限
使用GRANT命令来给用户授权,该命令常用语法如下,具体语法可使用help GRANT查看
GRANT priv_type[(<字段列表>)] [,priv_type[(<字段列表>)]]... ON priv_level TO <用户>[,<用户>]...
priv_type:{ALL |SELECT | INSERT | UPDATE | DELETE | CREATE | DROP | ALTER | 其他权限类型可查看手册}
priv_level: { *| *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name}
示例:
-
撤销用户权限
使用REVOKE命令来给用户授权,该命令常用语法如下,具体语法可使用help GRANT查看
REVOKE priv_type[(<字段列表>)] [,priv_type[(<字段列表>)]]...ON priv_level FROM <用户>[,<用户>]...
-
删除用户
1. 通过DEOP USER 删除用户
DROP USER常用语法如下,详细语法可通过help DROP USER命令查看。
DROP USER <用户名>[@<主机名>]
示例:
2. 通过操纵user表删除用户
示例:
注: 通过表修改需要FLUSH PRIVILEDGES或者重新登录才生效
授权原则说明
- 只授予能满⾜需要的最⼩权限,防⽌⽤户⼲坏事,⽐如⽤户只是需要查询,那就只给
SELECT权限就可以了,不要给⽤户赋予UPDATE、INSERT或者DELETE权限 - 创建⽤户的时候限制⽤户的登录主机,⼀般是限制成指定IP或者内⽹IP段
- 初始化数据库的时候删除没有密码的⽤户,安装完数据库的时候会⾃动创建⼀些⽤
户,这些⽤户默认没有密码 - 为每个⽤户设置满⾜密码复杂度的密码
- 定期清理不需要的⽤户,回收权限或者删除⽤户