mysql04-用户管理

  • MySQL用户可以分为普通用户root用户
  • root用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户的密码等管理权限;
  • 普通用户只拥有被授予的各种权限。
--匿名用户
mysql> SELECT * FROM mysql.user WHERE User = '';    --查看匿名用户
mysql> DELETE FROM mysql.user WHERE User = '';      --删除匿名用户

1、权限表

  • MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在MySQL数据库中,由mysql_install_db脚本初始化。
  • 存储账户权限信息的表主要有: user、db、host、tables_priv、columns_priv和procs_priv。
  • MySQL服务器在启动时将这些权限表的内容读入内存,并在这种情况下重新加载它们。访问控制决策基于授予表的内存副本

1、user表(用户帐号、全局权限)

  • user表记录允许连接到服务器的账号信息,里面的权限是全局级(所有用户的数据库)的。
  • MySQL 5.7中user表有42个字段,这些字段可以分为4类,分别是用户列、权限列、安全列和资源控制列。

1、用户列

  • user表的用户列包括Host、User、Password,分别表示主机名、用户名和密码。

2、权限列

  • user表中权限列的字段决定了用户的权限,描述了在全局范围(所有用户的数据库)内允许对数据和数据库进行的操作。
  • 这些字段值的类型为ENUM,可以取的值只能为Y和N, Y表示该用户有对应的权限; N表示用户没有对应的权限。默认都是N。
  • 包括普通权限和高级权限:
    • 普通权限用于操作数据库,例如查询权限、修改权限等
    • 高级权限用于数据库管理,例如关闭服务器、超级权限和加载用户等
  • 如果要修改权限,可以用GRANT语句或UPDATE语句更改user表的这些字段来修改用户对应的权限。

3、安全列

  • 安全列只有6个字段,其中两个是ssl相关的,两个是x509相关的,另外两个是授权插件相关的。
  • ssl用于加密; x509标准可用于标识用户: Plugin字段标识可以用于验证用户身份的插件,如果该字段为空,服务器使用内建授权验证机制验证用户身份。
  • 可以通过SHOW VARIABLES LIKE 'have_openssl'语句来查询服务器是否支持ssl功能。

4、资源控制列

  • max_questions:用户每小时允许执行的查询操作次数。
  • max_updates:用户每小时允许执行的更新操作次数。
  • max_connections:用户每小时允许执行的连接操作次数。
  • max_user-connections:用户允许同时建立的连接次数。

2、db表和host表

  • db表中存储了用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库
  • db表用户列有3个字段,分别是Host、User、Db,标识从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。
  • user表中的权限是针对所有数据库的,如果希望用户只对某个数据库有操作权限,那么需要将user表中对应的权限设置为N,然后在db表中设置对应数据库的操作权限。
  • host表(废弃)中存储了某个主机数据库的操作权限,配合db权限表对给定主机上数据库级操作权限做更细致的控制。
  • host表不存储用户名称,用户列只有2个字段,分别是Host和Db,表示从某个主机连接的用户对某个数据库的操作权限,其主键包括Host和Db两个字段。
  • host很少用到,一般情况下db表就可以满足权限控制需求了。

3、其他权限表

1、tables_priv表

  • tables_priv表用来对表设置操作权限。

2、columns_priv表

  • columns_priv表用来对表的某一列设置权限

3、procs_priv 表

  • procs_priv表可以对存储过程和存储函数设置操作权限

2、账户管理

mysql> select user,host,authentication_string from user;            --查看用户和密码

mysql> create user 'user'@'hostname' identified by 'newpwd';        --创建用户

mysql> DROP USER 'user'@'hostname';                                 --删除用户

mysql> SET PASSWORD FOR 'user'@'hostname' = PASSWORD('newpwd');     --修改密码

mysql> rename user 'user'@'hostname' to 'newuser'@'newhostname';    --修改用户

mysql> SELECT * FROM mysql.user WHERE User = '';                    --查看匿名用户
mysql> DELETE FROM mysql.user WHERE User = '';                      --删除匿名用户

1、登录和退出MySQL服务器

1、mysql命令

  • mysql [OPTIONS] [database]         #mysql命令
    • -h, --host=name:可以使用该参数指定要连接到主机名或ip,如果不指定,默认是localhost.
    • -u, --user=name:可以使用该参数指定用户名。
    • -p, --password[=name]:可以使用该参数指定登录密码。
      • 注意:该参数后面的字符串和-p之间不能有空格。
    • -P, --port=#:可以使用该参数指定要连接的端口号,默认为3306
    • -e, --execute=name:如果指定了该参数,将在登录后执行-e后面的命令或SQL语句并退出。
    • database:可以在命令的最后指定要连接的数据库。

示例

mysql -hlocalhost -P3306 -uroot -proot mysql     #后面的mysql是数据库的名称
mysql -u root -proot -e "show databases;"        #-e后面的命令要用双引号,不能使用单引号

2、用户帐号

1、user@hostname

  • user:16字符以内
  • hostname:
    • 主机名:www.hh.com
    • IP:172.16.10.177
    • 网络地址:
      • 172.16.0.0/255.255.0.0
    • 通配符:%,_
      • 172.16.%.%
      • %.hengha.com
    • 跳过主机名解析:
      • --skip-name-resolve

2、mysql使用的用户名和密码和你的操作系统使用的用户名和密码有几个区别

  • mysql用于身份验证目的的用户名与Windows或Unix所使用的用户名(登录名)无关。
  • mysql用户名最长可达16个字符。
  • 服务器使用存储在用户表中的mysql密码,使用mysql原生身份验证(针对存储在mysql中的密码)对客户机连接进行身份验证。
  • mysql使用自己的算法加密存储在用户表中的密码。这种加密与SQL函数PASSWORD()实现的加密相同,但与Unix登录过程中使用的加密不同。
  • 如果用户名和密码只包含ASCII字符,则无论字符集设置如何,都可以连接到服务器。

2、创建普通用户

  • 创建新用户,必须有相应的权限来执行创建操作。
  • 在mysql数据库中,有两种方式创建新用户:一种是使用CREATE USER或GRANT语句。另一种是直接操作mysql授权表。

1、使用CREATE USER语句创建新用户

  • CREATE USER语句会在mysql.user表中添加一条新记录,但是新创建的账户没有任何权限。(需要使用GRANT语句赋予用户权限)
  • CREATE USER语句的操作会被记录到服务器日志文件或者操作历史文件中,如mysql_history。这意味着对这些文件有读取权限的人,都可以读取新添加用户的明文密码。
  • 基本语法格式如下
CREATE USER user_specification1 [, user_specification2] ...    --可以同时创建多个用户

user_specification:                                            --user_specification(用户详述)的说明
    'user'@'hostname'
    [
        IDENTIFIED BY [PASSWORD] 'password'
      | IDENTIFIED WITH auth_plugin [AS 'auth_string']
    ]
    • user表示创建的用户的名称。
    • hostname表示允许登录的用户主机名称。
    • IDENTIFIED BY表示用来设置用户的密码。
    • [PASSWORD]表示使用哈希值设置密码,该参数可选:
    • 密码的哈希值可以使用password()函数获取。
    • mysql> SELECT password (‘mypass’);
    • 'password'表示用户登录时使用的普通明文密码。
    • IDENTIFIED WITH语句为用户指定一个身份验证插件。
    • auth_plugin是插件的名称,插件的名称可以是一个带单引号的字符串,或者带引号的字符串。
    • auth_string是可选的字符串参数该参数将传递给身份验证插件,由该插件解释该参数的意义。
  • IDENTFIED BY和IDENTIFIED WITH是互斥的,所以对于一个账户来说只能使用一个验证方法。

示例:

mysql> create user 'hh1'@'localhost' identified by 'hh1';    --密码使用明文

mysql> select password('hh2');                               --结果是:*B4C3992D3612F301F863C728585E816AAF13AE4C
mysql> create user 'hh2'@'localhost' identified by password '*B4C3992D3612F301F863C728585E816AAF13AE4C';    --密码使用哈希值

2、使用GRANT语句创建新用户

  • GRANT语句不仅可以创建新用户,还可以在创建的同时对用户权。GRANT还可以指定账户的其他特点,如使用安全连接、限制使用服务器资源等。
  • 使用GRANT语句创建新用户时必须有GRANT权限。
  • GRANT语句是添加新用户并授权他们访问mysql对象的首选方法。
  • GRANT在创建新用户时,会在mysql.user表中添加一条新记录
  • 基本语法格式如下
GRANT privileges ON db.table    --创建新用户
    To 'user'@'hostname' [IDENTIFIED BY 'password'] [, user [IDENTIFIED BY 'password' ]
    [WITH GRANT OPTION];
    • privileges:表示赋予用户的权限类型:
    • db.table:表示用户的权限所作用的数据库中的表:
    • IDENTIFIED BY:关键字用来设置密码:
    • password:表示用户密码:
    • WITH GRANT OPTION:为可选参数,表示对新建立的用户赋予GRANT权限,即该用户可以对其他用户赋予权限。

示例:

  • User表中的user和host字段区分大小写,在查询的时候要指定正确的用户名称或者主机名。
mysql> GRANT select,update ON *.* To 'hh3'@'localhost' IDENTIFIED BY 'hh3';
mysql> select host,user,select_priv,update_priv from mysql.user where user='hh3';
+-----------+------+-------------+-------------+
| host      | user | select_priv | update_priv |
+-----------+------+-------------+-------------+
| localhost | hh3  | Y           | Y           |
+-----------+------+-------------+-------------+
1 row in set (0.01 sec)

3、直接操作MySQL.user表(尽量不用)

  • 可以使用INSERT语句向mysql.user表中直接插入一条记录来创建一个新的用户。
  • 使用INSERT语句,必须拥有对mysql.user表的INSERT权限。
  • 不要直接将用户信息插入user表中,因为user表中存储了全局级别的权限以及其他的账户信息,如果意外破坏了user表中的记录,则可能会对MySQL服务器造成很大影响。
  • 基本语法格式如下
INSERT INTO MysQL.user (Host, User, Password, [privilegelist])    --创建新用户
    VALUES ('host', 'username',PASSWORD('password'),privileqevaluelist);
    • Host、User、Password分别为user表中的主机、用户名称和密码字段。
    • privilegelist表示用户的权限,可以有多个权限。
    • PASSWORDO()函数为密码加密函数。
    • privilegevaluelist为对应的权限的值,只能取'Y',或者'N'。

示例:

  • assl_cipher,x509_issuer和x509_subject这3个字段在user表定义中没有设置默认值。
mysql> INSERT INTO MysQL.user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject) 
       VALUES ('localhost', 'hh4',PASSWORD('hh4'), '', '', '');    --在mysql5.7.34中密码字段名是authentication_string
mysql> FLUSH PRIVILEGES;	--必须重新刷新权限

3、删除普通用户

在mysql数据库中,可以使用DROP USER语句删除用户,也可以直接通过DELETE语句从mysql.user表中删除对应的记录来删除用户。

1、使用DROP USER语句删除用户

  • DROP USER语句用于删除一个或多个mysql账户,并撤销其原有权限。
  • 要使用DROP USER,必须拥有mysql数据库的全局CREATE USER权限或DELETE权限。
  • 在 DROP USER 语句中,若没有明确地给出账户的主机名,则该主机名默认为“%”。
  • DROP USER不能自动关闭任何打开的用户对话。如果用户有打开的对话,此时取消用户,命令则不会生效,直到用户对话被关闭后才能生效。一旦对话被关闭,用户也被取消,此用户再次试图登录时将会失败。
  • 基本语法格式如下
DROP USER 'user'@'hostname' [, 'user'@'hostname', ...];              --删除普通用户

示例:

mysql> DROP USER 'user'@'localhost';                                 --可以删除user在本地登录权限;

2、使用DELETE语句删除用户

  • 基本语法格式如下
DELETE FROM MysQL.user WHERE host='hostname' and user='username';    --删除普通用户

示例:

  • host和user为user表中的两个字段,两个字段的组合确定所要删除的账户记录。
mysql> DELETE FROM MysQL.user WHERE host='localhost' and user='hh3';

4、修改MySQL用户的密码

1、使用mysqladmin命令在命令行指定新密码

  • 基本语法格式如下
mysqladmin -u username -h hostname -p password "newpwd"    #注意,要使用双引号,且后面没有分号
    • username为要修改密码的用户名称
    • 参数-h指需要修改的、对应哪个主机用户的密码,该参数可以不写,默认是localhost
    • -p表示输入当前密码
    • password为关键字,后面双引号内的内容"newpwd"为新设置的密码。

示例:

#修改root用户的密码
mysqladmin -uroot -hlocalhost -p password "root123"

#修改普通用户的密码
mysqladmin -u hh2 -h localhost -p password "hh222"

2、使用SET语句修改密码

  • SET PASSWORD语句可以用来重新设置其他用户的登录密码或者自己使用的账户的密码。
  • 新密码必须使用PASSWORD()函数加密。
  • 基本语法格式如下
--只有root用户可以更改其他用户的密码
SET PASSWORD FOR 'user'@'hostname' = PASSWORD('newpwd');

--更改自己的密码,可省略FOR子句
SET PASSWORD=PASSWORD("newpwd");

FLUSH PRIVILEGES;    --使用set语句修改密码,需要重新加载用户权限(即重新加载权限表)

示例:

--使用root用户修改自己和其他用户的密码
mysql> SET PASSWORD=PASSWORD("root");
mysql> FLUSH PRIVILEGES;

mysql> SET PASSWORD FOR 'hh2'@'localhost' = PASSWORD('hh222');
mysql> FLUSH PRIVILEGES;
--普通用户修改自己的密码
mysql> SET PASSWORD=PASSWORD("hh2");
mysql> FLUSH PRIVILEGES;

3、修改mysql.user表

  • 使用UPDATE语句修改用户的密码,需要用户有mysql.user表的UPDATE权限
  • 基本语法格式如下
UPDATE mysql.user set Password=PASSWORD("newpwd") WHERE User="username" AND Host="hostname";    --修改密码
FLUSH PRIVILEGES;    --修改密码后,需要重新加载用户权限(即重新加载权限表)

示例:

mysql> UPDATE mysql.user set authentication_string=PASSWORD("root123") WHERE User="root" and Host="localhost";    --在mysql5.7.34中密码字段名是authentication_string
mysql> FLUSH PRIVILEGES;

4、使用GRANT语句修改密码

  • 在全局级别使用GRANT USAGE语句(*.*)指定某个账户的密码而不影响账户当前的权限,使用GRANT语句修改密码,必须拥有GRANT权限
  • 一般情况下最好使用该方法来指定或修改密码。
  • 如果使用GRANT ...DENTIFIED BY语句或mysqladmin password命令设置密码,它们均会加密密码。不需要使用PASSWORD()函数。
  • 基本语法格式如下
GRANT USAGE ON *.* To 'user'@'hostname' IDENTIFIED BY 'somepassword';    --修改密码

示例:

--使用root用户修改root用户的密码
mysql> GRANT USAGE ON *.* To 'root'@'localhost' IDENTIFIED BY 'root123';
--使用root用户修改其他用户的密码
mysql> GRANT USAGE ON *.* To 'hh2'@'localhost' IDENTIFIED BY 'hh12';

5、root用户密码丢失的解决办法

1、windows

  • mysqld或mysql-nt跳过跳过数据库权限验证
    • mysqld --skip-grant-tables
    • mysqld-nt --skip-grant-tables

示例:

C:\>net stop mysql
C:\>mysqld --skip-grant-tables
打开另外一个命令行窗口
    C:\>mysql -uroot
修改root密码
    mysql> SET PASSWORD=PASSWORD("root");
加载权限表
    mysql> FLUSH PRIVILEGES;

2、Linux

  • mysqld_safe或mysql命令
    • mysqld_safe --skip-grant-tables user=mysql
    • mysql start-mysqld --skip-grant-tables

3、权限管理

  • mysql权限系统的主要功能是让给定主机的用户连接到mysql服务器,并且赋予该用户在数据库上的SELECT,INSERT,UPDATE和DELETE权限。

MySQL权限需要遵循的经验原则

  • 只授予能满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。
  • 创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。
  • 初始化数据库的时候删除没有密码的用户。安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。
  • 为每个用户设置满足密码复杂度的密码。
  • 定期清理不需要的用户。回收权限或者删除用户。

1、MySQL的各种权限

1、GRANT和REVOKE语句所涉及的权限的名称

2、mysql的权限分布

  • 表可以设置什么权限,列可以设置什么权限等。

3、管理性权限与mysqladmin命令

  • 每个管理性权限允许执行的mysqladmin命令。

  • reload命令告诉服务器将授权表重新读入内存。
  • flush-privileges是reload的同义词。
  • refresh命令清空所有表并打开并关闭记录文件。
  • 其它flush-xxx命令执行类似refresh的功能,但是范围更有限,并且在某些情况下可能更好用。例如,如果你只是想清空记录文件,flush-logs比refresh是更好的选择。
  • shutdown命令关掉服务器。只能从mysqladmin发出命令。没有相应的SQL语句。
  • processlist命令显示在服务器内执行的线程的信息(即其它账户相关的客户端执行的语句)。kill命令杀死服务器线程。用户总是能显示或杀死你自己的线程,但是需要PROCESS权限来显示或杀死其他用户和SUPER权限启动的线程。

2、权限的多个层级

1、全局层级

  • 全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON*.*只授予和撤销全局权限。

2、数据库层级

  • 数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。

3、表层级

  • 表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANTALL ON db_name.tb_name和REVOKE ALL ON db_name.tb_name只授予和撤销表权限。

4、列层级

  • 列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,必须指定与被授权列相同的列。

5、子程序层级

  • CREATE ROUTINE,ALTER ROUTINE,EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予子程序层级,并存储在mysql.procs_priv表中。

3、授权

  • 在MySQL中,必须是拥有GRANT权限的用户才可以执行GRANT语句。
  • 要使用GRANT或REVOKE,必须拥有GRANT OPTION权限,并且必须用于正在授予或撤销的权限。
  • 基本语法格式如下
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    TO user [IDENTIFIED BY [PASSWORD] 'password']
        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
    [REQUIRE
        NONE |
        [{SSL| X509}]
        [CIPHER 'cipher' [AND]]
        [ISSUER 'issuer' [AND]]
        [SUBJECT 'subject']]
    [WITH with_option [with_option] ...];

object_type = TABLE | FUNCTION | PROCEDURE

with_option =
    GRANT OPTION                      --可以将自己获得的权限赋予其他用户
  | MAX_QUERIES_PER_HOUR count        --用户每小时允许执行的查询操作次数
  | MAX_UPDATES_PER_HOUR count        --用户每小时允许执行的更新操作次数
  | MAX_CONNECTIONS_PER_HOUR count    --用户每小时允许执行的连接操作次数
  | MAX_USER_CONNECTIONS count        --用户允许同时建立的连接次数
    • priv_type参数表示权限类型。
    • column_list参数表示权限作用于哪些列上,不指定该参数,表示作用于整个表。
    • object_type指定授权作用的对象类型包括TABLE (表)、FUNCTION (函数)和PROCEDURE(存储过程),当从旧版本的MySQL升级时,要使用object_tpye子句,必须升级授权表。
    • tbl_name | * | *.* | db_name.*表示授予权限的列所在的表。
    • user参数表示用户账户,由用户名和主机名构成,形式是'username'@'hostname'。
    • IDENTIFIED BY参数用于设置密码。

示例1:授予某种限权

  • 使用GRANT语句创建一个新的用户grantUser,密码为"grantpwd"。用户grantUser对所有的数据有查询、插入权限,并授于GRANT权限。
mysql> GRANT SELECT, INSERT ON *.* TO 'grantUser'@'localhost' IDENTIFIED BY 'grantpwd' WITH GRANT OPTION;
mysql> SELECT Host, User, Select_priv, Insert_priv, Grant_priv FROM mysql.user where user='grantUser';
+-----------+-----------+-------------+-------------+------------+
| Host      | User      | Select_priv | Insert_priv | Grant_priv |
+-----------+-----------+-------------+-------------+------------+
| localhost | grantUser | Y           | Y           | Y          |
+-----------+-----------+-------------+-------------+------------+

示例2:授予所有权限

mysql> GRANT ALL PRIVILEGES ON *.* TO 'hh2'@'localhost' WITH GRANT OPTION;
mysql> show grants for 'hh2'@'localhost';
+--------------------------------------------------------------------+
| Grants for hh2@localhost                                           |
+--------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'hh2'@'localhost' WITH GRANT OPTION |
+--------------------------------------------------------------------+

4、收回授权

  • REVOKE语句有两种语法格式:
    • 第一种语法是收回所有用户的所有权限,此语法用于取消对于已命名的用户的所有全局层级、数据库层级、表层级和列层级的权限。
    • 另一种为长格式的REVOKE语句。
  • REVOKE语句必须和FROM语句一起使用,FROM语句指明需要收回权限的账户。
  • 在将用户账户从user表删除之前,应该收回相应用户的所有权限。
  • 第一种收回所用权限的基本语法格式如下
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...;
  • 第二种收回指定权限的基本语法格式如下
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    FROM user [, user] ...;
    • priv_type参数表示权限类型。
    • column_list参数表示权限作用于哪些列上,不指定该参数,表示作用于整个表。
    • object_type指定授权作用的对象类型包括TABLE (表)、FUNCTION (函数)和PROCEDURE(存储过程),当从旧版本的MySQL升级时,要使用object_tpye子句,必须升级授权表。
    • tbl_name | * | *.* | db_name.*表示授予权限的列所在的表。
    • user参数表示用户账户,由用户名和主机名构成,形式是'username'@'hostname'。

示例1:收回指定权限

mysql> REVOKE INSERT ON *.* FROM 'grantUser'@'localhost';

mysql> SELECT Host, User, Select_priv, Insert_priv, Grant_priv FROM mysql.user where user='grantUser';
+-----------+-----------+-------------+-------------+------------+
| Host      | User      | Select_priv | Insert_priv | Grant_priv |
+-----------+-----------+-------------+-------------+------------+
| localhost | grantUser | Y           | N           | Y          |
+-----------+-----------+-------------+-------------+------------+

示例2:收回所用权限

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'grantUser'@'localhost';

mysql> SELECT Host, User, Select_priv, Insert_priv, Grant_priv FROM mysql.user where user='grantUser';
+-----------+-----------+-------------+-------------+------------+
| Host      | User      | Select_priv | Insert_priv | Grant_priv |
+-----------+-----------+-------------+-------------+------------+
| localhost | grantUser | N           | N           | N          |
+-----------+-----------+-------------+-------------+------------+

5、查看权限

  • GRANT可以显示更加详细的权限信息,包括全局级的和非全局级的权限,如果表层级或者列层级的权限被授予用户的话,它们也能在结果中显示出来。
  • 基本语法格式如下
SHOW GRANTS FOR 'user'@'hostname';    --用户名和主机名都要用单引号括起来

示例:

mysql> SHOW GRANTS FOR 'grantUser'@'localhost';
mysql> SHOW GRANTS FOR 'root'@'localhost';

4、访问控制

  • MySQL的访问控制分为两个阶段:连接核实阶段和请求核实阶段。

1、访问控制的两个阶段

  • 第一阶段连接核实阶段:MySQL服务首先会检查是否允许你登录到MySQL服务器。即客户端用户连接请求中会提供用户名称、主机地址名和密码,MySQL服务使用user表中的3个字段(Host, User和Password)执行身份检查,服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受连接。
  • 第二阶段请求核实阶段:如果你能登录到MySQL服务器,MySQL服务会检查你发出的每个请求,看你是否有足够的权限实施它。例如,如果你从数据库表中选择(select)行或从数据库删除表,服务器确定你对表有SELECT权限或对数据库有DROP权限。

2、第二阶段权限查找顺序

  • 确认权限时,MySQL首先检查user表,如果指定的权限没有在user表中被授权;MySQL将检查db表,如果指定的权限没有在db表中被授权;MysQL将继续检查tables_priv表以及columns_priv表。如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将返回错误信息,用户请求的操作不能执行,操作失败。
  • MySQL请求核实过程

  • MySQL通过向下层级的顺序检查权限表(从user表到columns_priv 表) ,但并不是所有的权限都要执行该过程。例如,一个用户登录到MysQL服务器之后只执行对MySQL的管理操作,此时,只涉及管理权限,因此MySQL只检查user表。另外,如果请求的权限操作不被允许, MySQL也不会继续检查下一层级的表。
posted @ 2021-08-08 01:57  麦恒  阅读(186)  评论(0编辑  收藏  举报