MariaDB/MySQL用户和权限管理详解(2)

with_option: 
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
  | MAX_STATEMENT_TIME time

grant可以在库、表、函数、存储过程、特定列上授权,且一次性可以为多个用户授予多个对象的权限。其中 with grant option 表示拥有该权限后的用户可以给别的用户授予自身所拥有的权限。

revoke表示收回权限,注意revoke无法收回usage权限。

其中user的表示方法是 '用户名'@'主机名' ,主机名部分可以是主机名,可以是IP地址,可以是localhost,可以是通配符组成的主机名(空的host值也表示所有host,等价于'user_name'@'%')。如下示例:

MariaDB/MySQL用户和权限管理详解

对于网段地址,可以指定掩码来表示,如192.168.100.1/255.255.255.0,不能使用cidr格式的掩码记录方式,也不能指定非8、16、24、32位的掩码,如192.168.100.1/255.255.255.240是不允许的。

如果在user表中的用户有交叉部分,如root既可以从localhost登录,也可以从127.0.0.1登录,还可以从本机IP192.168.100.61登录,还可以从网段地址192.168.100.%登录,那么到底会从哪个登录?

在读取权限表user到内存中的时候,首先会根据host列的具体性进行排序,然后再根据user列进行具体性排序(即理解为order by host,user),然后从上到下扫描,首次扫描到符合的记录就使用该记录登录。具体性的意思是越具体的user优先级越高,通配符范围越宽的user优先级越低。例如root@localhost的具体性比root@'%'的具体性高,后者又比'%'@'%'的具体性高。

2.2 create user和alter user

在MySQL 5.6.7之前,不要使用这两个命令创建用户和修改用户,因为它们会在mysql.user表的password列设置空串。到mysql5.6.7解决了这个问题。MariaDB可随意使用。

语法:

CREATE [OR REPLACE] USER [IF NOT EXISTS]
 user_specification [,user_specification] ...
  [WITH resource_option [resource_option] ...]

user_specification:
  username [authentication_option]

authentication_option:
  IDENTIFIED BY 'authentication_string'
 
resource_option:
  MAX_QUERIES_PER_HOUR count
  | MAX_UPDATE_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count

例如:


create user 'longshuai'@'127.0.0.1' identified by '123456';

alter user和create user语法基本一致,但在MySQL中有让密码过期的功能,而在MariaDB中不支持该功能。

ALTER USER user_specification [, user_specification] ...
user_specification:
    user PASSWORD EXPIRE

例如,让刚才创建的用户过期。


alter user 'longshuai'@'127.0.0.1' password expire;

2.3 记录创建用户的时间

MariaDB/MySQL中user的元数据信息都存放在mysql.user表中,但是在这个表中的信息分类很少,常用的就只有用户类列和权限类列,没有用户的创建时间。

可以通过新增一列来记录用户的创建时间。


alter table mysql.user add column create_time timestamp default current_timestamp;

这样以后新建用户都会记录创建时间。但是显然,对于已有的用户是没有记录时间的,它们的值都为'0000-00-00 00:00:00'。

MariaDB [mysql]> select host,user,create_time from mysql.user;
+---------------------+-----------+---------------------+
| host                | user      | create_time        |
+---------------------+-----------+---------------------+
| localhost          | root      | 2018-04-21 05:58:19 |
| 127.0.0.1          | root      | 2018-04-21 05:58:19 |
| ::1                | root      | 2018-04-21 05:58:19 |
| localhost          |          | 2018-04-21 05:58:19 |
| 192.168.100.%      | root      | 2018-04-21 05:58:19 |
| 192.168.100.1      | long      | 2018-04-21 05:58:19 |
| 127.0.0.1          | longshuai | 2018-04-21 05:58:19 |
| 192.168.100.1      | longshuai | 0000-00-00 00:00:00 |
+---------------------+-----------+---------------------+

2.4 查看用户权限


可以使用show grants语句查看某个user的权限信息。

例如:

MariaDB [mysql]> show grants for 'root'@'localhost';

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/dd5a1ec91413e6349048c75d839a3a67.html