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

MariaDB/MySQL中的user由用户名和主机名构成,如"root@localhost",同用户名但不同主机名对MySQL/MariaDB来讲是不同的,也就是说"root@localhost"和"root@127.0.0.1"是不同的用户,尽管它们都是本机的root。

1.权限验证

在MariaDB/MySQL服务器启动后会载入权限表到内存中,当用户要连接服务器,会读取权限表来验证和分配权限,即在内存中进行权限的读取和写入。

MariaDB/MySQL中的权限系统经过两步验证:

1.合法性验证:验证user是否合法,合法者允许连接服务器,否则拒绝连接。

2.权限验证和分配:对通过合法性验证的用户分配对数据库中各对象的操作权限。

1.1 权限表

MariaDB/MySQL中的权限表都存放在mysql数据库中。MySQL5.6以前,权限相关的表有user表、db表、host表、tables_priv表、columns_priv表、procs_priv表(存储过程和函数相关的权限)。从MySQL5.6开始,host表已经没有了。MariaDB中虽然有host表,但却不用。

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

这几个表用的最多的是user表。user表主要分为几个部分:用户列、权限列、安全列、资源控制列以及杂项列,最需要关注的是用户列和权限列。其中权限列又分为普通权限(上表中红色字体)和管理权限列,如select类的为普通权限,super权限为管理权限。且可以看到,db表中的权限全都是普通权限,user表中除了db表中具有的普通权限还有show_db_pirv和create_tablespace_priv,除此之外还有几个管理员权限。也就是说,db中没有的权限是无法授予到指定数据库的。例如不能授予super权限给test数据库。

另外,usage权限在上表中没有列出,因为该权限是所有用户都有的权限,它只用来表示能否登录数据库,它的一个特殊功能是grant仅指定该权限的时候不会影响现有权限,也就是说可以拿grant来修改密码而不影响现有权限。

需要说明的是,从user表到db表再到tables_priv表最后是columns_priv表,它们的权限是逐层细化的。user表中的普通权限是针对所有数据库的,例如在user表中的select_priv为Y,则对所有数据库都有select权限;db表是针对特定数据库中所有表的,如果只有test数据库中有select权限,那么db表中就有一条记录test数据库的select权限为Y,这样对test数据库中的所有表都有select权限,而此时user表中的select权限就为N(因为为Y的时候是所有数据库都有权限);同理tables_priv表也一样,是针对特定表中所有列的权限;columns_priv则是针对特定列的权限。

所以对于已经通过身份合法性验证的用户的权限读取和分配的机制如下:
•1.读取uesr表,看看user表是否有对应为Y的权限列,有则分配。
•2.读取db表,看看db表中是否有哪个数据库分配了对应的权限。
•3.读取tables_priv表,看看哪些表中有对应的权限。
•4.读取columns_priv表,看看对哪些具体的列有什么权限。

例如,为某一用户授予test数据库的select权限。可以看到user表中的select_priv为N,而db表中的select为Y。

GRANT SELECT ON test.* TO 'long'@'192.168.100.1' IDENTIFIED BY '123456';
SELECT host,user,select_priv FROM mysql.user;
SELECT * FROM mysql.db;

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

1.2 图解认证和权限分配的两个阶段

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

1.3 权限生效时机

在服务器启动时读取权限表到内存中,从此时开始权限表生效。

之后使用grant、revoke、set password 等命令也会隐含的刷新权限表到内存中。

另外,使用显式的命令flush privileges或mysqladmin flush-privileges或mysqladmin reolad也会将上述几张权限表重新刷到内存中以供后续的身份验证和权限验证、分配。

2.用户管理

用户管理分为几个方面,创建用户、对用户授权、修改和删除用户。

2.1 创建用户

创建账号有几种方法。
•1.使用grant直接对账号授权,账号不存在则会创建;
•2.向mysql.user表中插入记录;
•3.使用create user命令。

后两种方法创建的用户初始时没有任何权限(只有usage登录数据库的权限),并且修改权限后要使用 FLUSH PRIVILEGES 语句或执行 mysqladmin flush-privileges 或 mysqladmin reload 命令刷新权限表到内存中,而第一种方法简便的多,创建用户后会自动刷新权限表。

grant和revoke语法:

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user  [IDENTIFIED [BY [PASSWORD] 'password'][WITH with_option [with_option]

object_type:
    TABLE
  | FUNCTION
  | PROCEDURE

priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name

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

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