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会从新加载系统权限表数据到内存。

相关推荐
C吴新科3 分钟前
MySQL入门操作详解
mysql
Ai 编码助手3 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员3 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle3 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻3 小时前
MySQL排序查询
数据库·mysql
萧鼎3 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^3 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
荒川之神3 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师3 小时前
Oracle 23AI创建示例库
数据库·oracle