MySQL 的用户管理和权限管理
1、DCL(数据库控制语言)
数据库授权、角色控制等操作
GRANT 用户授权,为用户赋予访问权限
REVOKE 取消授权,撤回授权权限
2、MySQL 权限表
1) mysql.user
用户字段:Host、User、Password
权限字段:_Priv结尾的字段
安全字段:ssl x509字段
资源控制字段:max_开头的字段
2) mysql.db
用户字段:Host、User、Password
权限字段:剩下的_Priv结尾的字段
3) mysql.tables_priv,mysql.columns_priv、procs_priv
表、列、存储过程的授权表
4) 授权级别排列
mysql.user #全局授权
mysql.db #数据库级别授权
其他 #表级,列级授权
5) 数据库和表格式
数据库名.* //数据库中的所有
数据库名.表名 //指定数据库中的某张表
数据库名.存储过程 //指定数据库中的存储过程
*.* //所有数据库
6) 用户和 IP格式
用户名@IP地址 //用户只能在改IP下才能访问
用户名@192.168.1.% //用户只能在改IP段下才能访问(通配符%表示任意)
用户名@%.test.com
用户名@% //用户可以再任意IP下访问(默认IP地址为%)
3、MySQL 用户管理
1) 创建用户
CREATE USER语句创建
CREATE USER '用户名'@'IP地址' [ IDENTIFIED BY '密码' ];
GRANT语句创建
GRANT SELECT ON *.* TO '用户名'@’IP地址’ IDENTIFIED BY "密码";
创建实例
CREATE USER 'qfedu'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'qfedu'@'192.168.1.101' IDENDIFIED BY '123456';
CREATE USER 'qfedu'@'192.168.1.%' IDENDIFIED BY '123456';
CREATE USER 'qfedu'@'%' IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'user3'@’localhost’ IDENTIFIED BY ‘123456’;
2) 删除用户
DROP USER 删除
DROP USER '用户名'@'IP地址';
实例
DROP USER 'user1'@’localhost’;
DELETE 语句删除
DELETE FROM mysql.user WHERE user='用户名' AND host='IP地址'
实例
DELETE FROM mysql.user WHERE user=’user2’ AND host=’localhost’;
3) 修改用户
RENAME USER '旧用户名'@'IP地址' TO '新用户名'@'IP地址' ;
实例
RENAME USER 'old_user'@‘localhost’ TO 'new_user'@'localhost';
4) 修改密码
注意:修改完密码必须刷新权限
FLUSH PRIVILEGES;
root 用户修改自己密码
方法一:
mysqladmin -uroot -p123 password 'new_password' # 123为旧密码
方法二:
alter user 'root'@'localhost' identified by 'new_pssword';
方法三:
SET PASSWORD=password(‘new_password’);
root 修改其他用户密码
方法一:
alter user 'qfedu'@'localhost' identified by 'Qfedu.1234com';
方法三:
GRANT SELECT ON *.* TO 用户名@’ip地址’ IDENTIFIED BY ‘yuan’;
普通用户修改自己密码
SET password=password(‘new_password’);
5) 找回 root 密码
修改 MySQL 配置文件
在[mysqld]下面加上 skip-grant-tables
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
···
#设置免密登录
skip-grant-tables
重启 MySQL
[root@localhost ~]# systemctl restart mysqld
修改密码
终端输入 mysql 直接登录 MySQL数据库
[root@localhost ~]# mysql
切换到 MySQL 系统库 mysql
mysql> use mysql;
设置密码
mysql> update user set authentication_string=password('密码') where user='root';
6) 注释掉免密登录
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
···
#设置免密登录
#skip-grant-tables
7) 重启 MySQL 然后登录
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -p
8) 密码复杂度
安装密码插件
MySQL 默认启用了密码复杂度设置,插件名字叫做 validate_password
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
修改配置文件
修改配置
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
plugin-load=validate_password.so
validate_password_policy=0
validate-password=FORCE_PLUS_PERMANENT
重启MySQL生效
[root@localhost ~]# systemctl restart mysqld
查看错误日志
登陆数据库查看
mysql> show variables like 'validate%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.04 sec)
validate_password_policy
代表的密码策略,可配置的值有以下:默认是MEDIUM 0 or LOW 仅需需符合密码长度(由参数validate_password_length指定)
1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中
validate_password_dictionary_file
用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文 件,字典文件中存在的密码不得使用。
validate_password_length
用来设置密码的最小长度,默认值是8最小是0
validate_password_mixed_case_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写 字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。
validate_password_number_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默 认1最小是0
validate_password_special_char_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个 数,默认1最小是0
9) 密码不符合复杂性
mysql> GRANT ALL ON *.* TO admin1@'%' IDENTIFIED BY '123';
ERROR 1819 (HY000): Your password does not satisfy the current policy
requirements
处理方法:
查看密码策略
mysql> select @@validate_password_policy; # 查看密码复杂性策略
mysql> select @@validate_password_length; # 查看密码复杂性要求密码最低长度大小
更换符合复杂性要求的密码
mysql> set global validate_password_length=1; # 设置密码复杂性要求密码最低长度为1
关闭复杂性策略
mysql> set global validate_password_policy=0; # 关闭密码复杂性策略
4、MySQL 登录
mysql -u用户名 -p密码 [ -h主机 ] [ -P端口 ];
mysql -u用户名 -p密码 [ -h主机 ] [ -P端口 ] [ -e"SQL语句" ];
实例
[root@localhost ~]# mysql -uroot -hlocalhost -p'qfedu.123com' -P3306
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
5、MySQL 权限管理
1) 查看权限
SHOW GRANTS FOR '用户'@'IP地址';
可以不指定用户,则显示当前用户权限
实例
mysql> SHOW GRANTS FOR 'root'@'localhost';
2) 授权及设置密码
授权及设置密码
GRANT 权限 [,权限...[,权限]] NO 数据库.数据表 TO '用户'@'IP地址';
GRANT 权限 [,权限...[,权限]] NO 数据库.数据表 TO '用户'@'IP地址' IDENTIFIED BY '密码';
可以简化多次授权,并用逗号分隔
GRANT需要明确一下信息 要授予的权限 被授予权限的数据库或表 用户名
权限简介
授权设置密码实例
mysql> GRANT ALL ON *.* TO admin1@'%' IDENTIFIED BY '(Qfedu.123com)';
mysql> GRANT ALL ON *.* TO admin2@'%' IDENTIFIED BY '(Qfedu.123com)' WITH GRANT
OPTION;
mysql> GRANT ALL ON qfedu.* TO admin3@'%' IDENTIFIED BY '(Qfedu.123com)';
mysql> GRANT ALL ON qfedu.* TO admin3@'192.168.122.220' IDENTIFIED BY
'(Qfedu.123com)';
mysql> GRANT ALL ON qfedu.user TO admin4@'%' IDENTIFIED BY '(Qfedu.123com)';
mysql> GRANT SELECT(col1),INSERT(col2,col3) ON qfedu.user TO admin5@'%'
IDENTIFIED BY '(Qfedu.123com)';
4) MySQL 8.x 授权方式
创建新的用户
CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';
数据库授权
GRANT ALL PRIVILEGES ON 数据库名.* TO '用户名'@'IP地址';
回收权限
REVOKE 权限 ON 数据库.数据表 FROM '用户'@'IP地址';
被回收的权限必须存在,否则会出错
整个服务器,使用 GRANT ALL 和 REVOKE ALL;
整个数据库,使用 ON datebase.*;
特定的表:使用 ON datebase.table;
实例
mysql> REVOKE DELETE ON *.* FROM admin1@’%’;
# 回收指定权限
mysql> REVOKE ALL PRIVILEGES ON *.* FROM admin2@’%’;
# 回收所有权限
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION ON *.* FROM 'admin2'@'%';
# 回收多个指定权限
4) 刷新权限
mysql> FLUSH PRIVILEGES;
flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库 (MySQL数据库的内置库)中提取到内存里。
NT ALL 和 REVOKE ALL;
整个数据库,使用 ON datebase.*;
特定的表:使用 ON datebase.table;
实例
mysql> REVOKE DELETE ON *.* FROM admin1@’%’;
# 回收指定权限
mysql> REVOKE ALL PRIVILEGES ON *.* FROM admin2@’%’;
# 回收所有权限
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION ON *.* FROM 'admin2'@'%';
# 回收多个指定权限
4) 刷新权限
mysql> FLUSH PRIVILEGES;
flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库 (MySQL数据库的内置库)中提取到内存里。
MySQL用户数据和权限有修改后,搜索希望在"不重启MySQL服务"的情况下直接生效,那么就需 要执行这个命令