mysql 用户权限管理

mysql使用系统库mysql的user表来存储用户信息。mysql.user表详细的记录了用户名,对应的允许连接的主机信息还有各种全局权限标识位。

用户管理

创建用户
复制代码
CREATE USER '用户名'@'host主机' IDENTIFIED BY '密码';

上面是创建用的基本命令,指定了用户名,密码和允许连接的主机。其中host如果设置为localhost,则是只允许本机连接,不允许远程连接。如果开放远程连接可以使用'%'(允许所有主机连接)。一般root用户不开启远程连接为好。也可以使用通配符,如'192.168.10.%'

关于密码,以前的版本可以使用PASSWORD('密码')函数来设置密码,该函数已经被标记为过时,且在mysql8中被删除了,尽量直接使用密码明文即可,下面的auth plugin会自动进行密码的加密。

除了基本信息外,还可以有其它选项进行账号属性设置

1、设置密码校验插件(auth plugin)
复制代码
CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED WITH caching_sha2_password BY 'password'

密码的存储都是密文,在密码加密过程中可以指定密码认证插件,使用上面的IDENTIFIED WITH语句来明确指定认证插件,其中caching_sha2_password就是一种认证方式。mysql有多个认证插件,在MySQL 8.0.27之前的版本,使用default_authentication_plugin变量来定义默认的认证插件

5.7

复制代码
mysql> SELECT @@default_authentication_plugin;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| mysql_native_password           |
+---------------------------------+

8.0

复制代码
mysql> SELECT @@default_authentication_plugin ;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| caching_sha2_password           |

对于mysql5.7默认的认证插件方式是mysql_native_password,对于8.0版本新增了一个caching_sha2_password作为默认认证插件。

2、设置密码过期时间
复制代码
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;

使用PASSWORD EXPIRE语句来指定密码的有效期,像上面的INTERVAL 180 DAY就是180天后过期。

如果没有明确指定密码过期策略,默认使用default_password_lifetime指定值来确认密码过期方式。

复制代码
mysql> select @@default_password_lifetime;
+-----------------------------+
| @@default_password_lifetime |
+-----------------------------+
|                           0 |

default_password_lifetime默认值是0表示永远不过期,如果指定一个大于0的值,代表多少天后过期。

密码过期有以下常见格式:

1、PASSWORD EXPIRE

后面没有任何参数,密码立即过期。这样可以创建一个不能登录的账号

2、PASSWORD EXPIRE DEFAULT

使用默认的过期策略,也就是default_password_lifetime指定的方式

3、PASSWORD EXPIRE NEVER

永不过期

4、PASSWORD EXPIRE INTERVAL N DAY

N天后过期

3、锁定用户
复制代码
CREATE USER test@'%' ACCOUNT LOCK;

锁定的用户,客户端登录会报:Error number: 3118; Symbol: ER_ACCOUNT_HAS_BEEN_LOCKED; SQLSTATE: HY000 . Account is locked.错误。

4、访问资源限制
复制代码
CREATE USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100 
  MAX_USER_CONNECTIONS 10;
  • MAX_USER_CONNECTIONS

当前用户最大允许创建连接数,默认值使用max_user_connections变量,变量值为0表示不限制。

  • MAX_CONNECTIONS_PER_HOUR ,MAX_QUERIES_PER_HOUR,MAX_UPDATES_PER_HOUR

这三个参数限制了每小时连接数、查询数和更新数。

用户修改

用户的修改要素和create语句是一样的,只不过语句变成了ALTER.如下:

mysql 复制代码
ALTER USER 'jeffrey'@'localhost'
  IDENTIFIED WITH sha256_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY;

修改用户时:用户名和host组成了条件信息。

用户删除
复制代码
DROP USER 'jeffrey'@'localhost';

如果不指定host,默认删除host值为'%'的记录。

权限管理

权限分类

数据库有很多中权限,按照作用范围不同大致可以分为以下几种权限:

全局权限

ALL [PRIVILEGES]:所有的权限

SHOW DATABASES:使用SHOW DATABASES 命令查看数据库列表权限

PROCESS:允许使用SHOW PROCESSLIST查看所有进程权限

SHUTDOWN:允许使用mysqladmin shutdown命令关闭数据库权限

FILE:允许文件操作权限,像select into outfile,load data infile等都需要该权限

CREATE USER:允许CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES操作

REPLICATION SLAVE:允许用户读取binlog进行主从复制

REPLICATION CLIENT:允许查看复制状态,像show master status,show slave status,show binary logs命令

SUPER:超级权限,允许执行一系列数据库管理命令,像CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, and mysqladmin等命令

RELOAD:允许执行flush命令

CREATE TABLESPACE:表空间管理权限

GRANT OPTION:分配权限操作

数据库对象操作权限:

CREATE VIEW:创建视图权限

SHOW VIEW:使用SHOW CREATE VIEW查看视图权限

TRIGGER:触发器操作权限

CREATE ROUTINE:创建存储过程和函数权限

ALTER ROUTINE:修改存储过程和函数权限

EXECUTE:执行存储过程和函数权限

INDEX:索引操作权限

CREATE TEMPORARY TABLES:创建临时表权限

CREATE:创建数据库,创建表权限

ALTER:修改表操作

DROP:删除数据库、表、视图,truncate table等权限

LOCK TABLES:锁表权限

表数据操作权限:

INSERT:插入数据权限,ANALYZE TABLE, OPTIMIZE TABLE操作也需要该权限

DELETE:删除数据

SELECT:查询权限

UPDATE:更新数据权限

更多权限可以查看官方网站 privileges-provided

权限分配

权限的分配使用GRANT语句

复制代码
GRANT priv_type...  ON [object_type] priv_level TO user

priv_type是权限列表,多个用英文逗号相隔

object_type:对象范围,可以是数据库,表,存储过程等。

mysql 复制代码
#全局级别
GRANT ALL ON *.* TO 'someuser'@'somehost';
#数据库级别
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
#表级别
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
#列级别
GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
#ROUTINE
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';

被grant分配后的权限,根据权限类型的不同存储在系统库不同的表中:

全局权限存储在:sys.user表中

数据库级别权限存储在:mysql.db表中

表级权限存储在:mysql.tables_priv表

列级别存储在:mysql.columns_priv表

ROUTINE类型存储在mysql.procs_priv。

user需要用户名和host两部分表示,格式是 username@host。host同创建用户时host,username可以是空表示给所有用户赋通用权限。

例:

mysql 复制代码
#将db1数据库所有权限赋给用户
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
#将db2库invoice对象的查询权限赋给用户
GRANT SELECT,INSERT ON db2.invoice TO 'jeffrey'@'localhost';
权限回收

权限的回收使用REVOKE语句,revoke语法几乎和grant一致,只是grant改成了revoke。

复制代码
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
权限查询

使用show grants可以查看分配的用户权限,如果要查特定用户的可以使用for user来指定

mysql 复制代码
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
SHOW GRANTS FOR 'jeffrey'@'localhost';

在grant或revoke修改了权限后,一般会使用FLUSH PRIVILEGES命令使权限生效。FLUSH PRIVILEGES会从新加载系统权限表数据到内存。

相关推荐
JIngJaneIL23 分钟前
基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
陈平安安1 小时前
设计一个秒杀功能
java·数据库·sql
isNotNullX1 小时前
数据处理的流程是什么?如何进行数据预处理?
数据库·数据资产管理·数据处理·企业数字化
TAEHENGV1 小时前
基本设置模块 Cordova 与 OpenHarmony 混合开发实战
android·java·数据库
Leo1871 小时前
MySQL 回表(Back to Table)详解
数据库·mysql
遇见火星1 小时前
MySQL 8.0复制架构主从自动切换脚本
mysql·adb·架构·mysql8.0·mysql主从
不知江月待何人..1 小时前
MySQL服务无法启动问题
数据库·mysql
廋到被风吹走1 小时前
【数据库】【Oracle】SQL基础
数据库·sql·oracle
曹牧2 小时前
Oracle统计每日发生次数
数据库·oracle
范纹杉想快点毕业2 小时前
返璞归真还是拥抱现代?——嵌入式研发中的“裸机开发”与RTOS全景解析
c语言·数据库·mongodb·设计模式·nosql