MySQL|MySQL 用户管理

? MySQL是一个多用户数据库,可以为不同用户指定允许的权限。MySQL用户可以分为普通用户和root用户。

  • root用户是超级管理员,拥有所有权限,
  • 普通用户只拥有被授予的各种权限
? 用户管理包括但不限于管理用户账户、权限等。
目录

  • 一、权限表
  • 二、账户管理
    • 1. 登录和退出MySQL服务器
    • 2. 新建普通用户
      • (1)使用CREATE USER 语句创建新用户
      • (2)使用GRANT语句来创建新用户
      • (3)直接操作MySQL用户表
    • 3. 删除普通用户
      • (1)使用 DROP USER 语句删除用户
      • (2)使用DELETE语句删除用户
    • 4. root用户修改自己的密码
      • (1)使用 mysqladmin 命令在命令行指定新密码
      • (2)修改 mysql 数据库的 user 表
      • (3)使用SET语句修改root用户的密码
    • 5. root用户修改普通用户权限
      • (1)使用 SET 语句修改普通用户的密码
      • (2)使用UPDATE语句修改普通用户的密码
      • (3)使用 GRANT 语句修改普通用户密码
    • 6. 普通用户修改密码
  • 三、权限管理
    • 1. MySQL的各种权限
    • 2. 授权
    • 3. 收回权限
    • 4. 查看权限
  • 四、访问控制
    • 1. 连接核实阶段
    • 2. 请求合适阶段

一、权限表 ? MySQL通过权限表来控制用户对数据库的访问,权限表就在默认的数据库mysql中,由mysql_install_db脚本初始化,存储账户权限信息表主要有:user、db、host、tables_priv、column_priv和procs_priv。
user表
? user表是记录允许连接到服务器的账户信息,里面的权限是全局级别的。
db表和host表
? db表中存储了用户对某个用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库。
? host表中存储了某个主机对数据库的操作权限,配合db权限表对给定主机上数据库级操作权限做更细致的控制。
tables_priv表和colums_priv表
? tables_priv表用来对表设置操作权限,columns_priv表用来对表的某一列设置权限。
二、账户管理 ? MySQL提供许多语句来管理用户账号,这些语句可以用来管理包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。通过账户管理来保证MySQL数据库的安全性。
1. 登录和退出MySQL服务器 ? 使用mysql命令并在后面指定登录主机以及用户名和密码。通过mysql-help命令可以查看mysql命令。
mysql命令的常用参数
参数 说明
-h主机名 指定主机名或ip,如果不指定,默认是localhost
-u用户名 指定用户名
-p密码 指定登录密码。如果该参数后面有一段字段,则该段字符串将作为用户的密码直接登录。如果后面没有内容,则登录的时候会提示输入密码。注意:该参数后面的字符串和-p不能有空格
-P端口号 该参数后面接MySQL服务器的端口号,默认为3306
数据库名 可以在命令的最后指定数据库名
-e执行sql语句 如果指定了该参数,将在登录后执行-e后面的命令或sql语句并退出。
2. 新建普通用户 ? 创建新用户,必须有相应地权限来执行创建操作。
(1)使用CREATE USER 语句创建新用户
? 执行CREATE USER或GRANT语句时,服务器会修改相应地用户授权表,添加或者修改用户及其权限。
CREATE USER user_specification [,user_specification]...user_specification: user@host [ IDENTIFIED BY [PASSWORD]'password' |IDENTIFIED WITH auth_plugin[AS'auth_string'] ]

  • user:表示创建的用户的名称
  • host:表示允许登录的用户主机名称
  • IDENTIFIED BY: 表示用来设置用户的密码,该参数可选
  • password:表示用户登录时使用的普通明文密码
  • IDENTIFIED WITH: 为用户指定一个身份验证插件
  • auth_plugin:是可选的字符串参数,传递给身份验证插件,由该插件解释该参数的意义。
    IDENTIFIED BY和IDENTIFIED WITH是互斥的,所以对于一个账户只能使用一个验证方法
? CREATE USER语句会添加一个新的MySQL账户。使用CREATE语句用户,必须有全局的CREATE USER权限或MySQL数据库的INSERT权限。每添加一个用户,CREATE USER语句会在mysql.user表中添加一天新纪录,但是新创建的账户没有任何权限。如果添加的账户已经存在,CREATE USER语句会返回一个错误。
(2)使用GRANT语句来创建新用户
? 虽然CREATE USER语句可以用来创建新用户,但是所创建的新用户确没有任何权限,仍需要GRANT语句赋予用户权限。而GRANT不仅可以创建新用户,还可以在创建的同时对用户授予权限,因此,添加新用户并授权它们访问MySQL对象应首选GRANT语句。同样,使用GRANT必须有GRANT权限。
GRANT privileges ON db.table TO user@host [IDENTIFIED BY 'password'][,user[IDENTIFIED BY 'password']] [WITH GRANT OPTION]

  • privileges:表示赋予用户的权限类型
  • db.table:表示用户的权限所作用的权限所作用的数据库中的表
  • IDENTIFIED BY:用来设置密码
  • password:表示用户密码
  • WITH GRANT OPTION:可选参数,表示对新建立的用户赋予GRANT权限,即该用户可以对其他用户赋予权限。
?添加或者修改用户权限之后可以对mysql.user表进行查询,注意:user表中的user和host区分大小写,在查询的时候要指定正确的用户名称或者主机名。
(3)直接操作MySQL用户表
? 其实上述的两种添加新用户的操作,实际都是在user表中添加一条新的记录。因此,可以使用INSERT语句向user表中直接插入一条记录来创建一个新的用户。使用INSERT语句,向user表中直接插入一条记录来创建一个新的用户。需要有mysql.user表的INSERT权限。
INSERT INTO mysql.user(Host,User,Password,[privilegelist]) VALUES('host','username',PASSWORD('password'),privilegevaluelist);

  • PASSWORD()函数为密码加密函数
  • privilegevaluelist为对应的权限的值,只能取 ‘Y’ 或者 ‘N’
    INSERT语句需要使用PASSWORD()函数加密密码;GRANT语句会自动将密码加密后存入user表,因此不需要PASSWORD().
? 还要注意的是,新用户添加成功后还无法使用账号密码登录MySQL,需要使用FLUSH命令,因此执行FLUSH PRIVILEGES,使服务器重新加载授权表(重启也可以重新加载授权表)才能实现登录,使用FLUSH命令需要有RELOAD权限。
FLUSH PRIVILEGES;

使用GRANT则不需要使用FLUSH PRIVILEGES。
3. 删除普通用户 ? 在MySQL数据库中,可以使用 DROP USER 语句删除用户,也可以直接通过DELETE从mysql.user表中删除对应的记录来删除用户。
(1)使用 DROP USER 语句删除用户
DROP USER user[,user];

? DROP USER语句用于删除一个或者多个MySQL账户。要使用DROP USER,必须拥有MySQL数据库的全局CREATE权限或者DELETE权限。使用与GRANT与REVOKE相同的格式为每个账户命名。
? DROP USER不能自动关闭任何打开的用户对话。而且如果用户有打开的对话,此时取消用户,命令则不会生效,直到用户对话被关闭后才能生效,一旦用户对话被关闭,用户也被取消,此用户再次试图登录时将会失败
(2)使用DELETE语句删除用户
DELETE FROM mysql.user WHERE host=‘hostname’ and user=‘username’

? host和user为user表中的两个字段,两个字段的组合确定所要删除的账户记录
4. root用户修改自己的密码 ?root用户拥有最高的权限,因此root用户的安全对于MySQL非常重要。修改root用户密码的方式有多种。
(1)使用 mysqladmin 命令在命令行指定新密码
mysqladmin -u username -h localhost -p password‘newpassword’

  • username:为要修改密码的用户名称,在这里指定为root
  • -h指需要修改的、对应哪个主机用户的密码,默认为localhost
  • newpassword:为新设置 的密码
(2)修改 mysql 数据库的 user 表
? 因为所有账户信息都保存在user表中,因此可以通过直接修改用户表来改变root用户的密码。root用户登录到MySQL服务器后,使用UPDATE语句修改mysql数据库的user表的password字段,从而修改用户的密码。
UPDATE mysql.user SET password=PASSWORD('newpassword') WHERE user='roow'and host='localhost'

执行完UPDATE语句后,也需要执行FLUSH PRIVILEGES 语句重载用户权限。
(3)使用SET语句修改root用户的密码
? SET PASSWORD 语句重新设置其他用户的登录密码或者自己使用的账户的密码。
SET PASSWORD=PASSWORD('newpassword')

  • 新密码必须使用 PASSWORD 函数加密
  • 执行成功之后需要重新加载权限表
5. root用户修改普通用户权限 ? root用户拥有很高的权限,不仅可以修改自己的密码,还可以修改其他用户的密码。
(1)使用 SET 语句修改普通用户的密码
SET PASSWORD FOR 'user'@'host'=PASSWORD('newpassword');

  • 只有root可以通过更新mysql数据库的用户来更改其他用户的密码。如果使用普通用户修改,可省略FOR子句更改自己的密码。
(2)使用UPDATE语句修改普通用户的密码
同root使用UPDATE修改密码,执行UPDATE要使用FLUSH PRIVILEGES语句重新加载用户权限。
(3)使用 GRANT 语句修改普通用户密码
? 在全局级别使用GRANT USAGE语句(*.*)指定某个账户的密码而不影响账户当前的权限,使用GRANT语句修改密码,必须拥有GRANT权限,一般情况下最好使用该方法来指定或修改密码
GRANT USAGE ON \*.\* TO 'user'@'%'IDENTIFIED BY 'newpassword'

使用GRANT…IDENTIFIED BY 语句,会自动加密密码,不需要使用PASSWORD函数
6. 普通用户修改密码 ? 普通用户登录MySQL之后,通过SET语句设置自己的密码。
SET PASSWORD=PASSWORD('newpassword');

三、权限管理 ?权限管理主要是对登录到MySQL的用户进行权限验证,所有用户的权限都存储在MySQL的权限表中,不合理的权限规划会给MySQL服务器带来安全隐患。MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE权限。
1. MySQL的各种权限 ? 账户权限信息被存储在mysql数据库中。在服务启动时,将mysql数据库中的表中权限信息的内容读入内存
MySQL|MySQL 用户管理
文章图片

MySQL|MySQL 用户管理
文章图片

不同权限下可以使用的mysqladmin命令
MySQL|MySQL 用户管理
文章图片

2. 授权 ?授权就是为某个用户授予权限。合理的授权将保证数据库的安全。
授予的权限层级
权限 说明
全局权限 适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。
数据库层级 适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host 表中。
表层级 适用于一个给定表中的所有列。这些权限存储在mysql.tables_priv表中。
列层级 适用于一个给定表中的单一列。这些权限保存在 mysql.columns_priv 表中。当使用REVOKE时,必须指定与被授权列相同的列。
子程序层级 适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且CREATE ROUTINE外,这些权限可以被授予子程序层级,并存储在mysql.procs_priv
3. 收回权限 ? 收回权限就是取消已经赋予用户的某些权限。MySQL中使用REVOKE语句取消用户的某些权限。使用REVOKE收回权限之后,用户账户的记录将从db、host、tables_priv 和columns_priv表中删除,但是用户账户仍然保存在user表中。
收回用户的所有权限 REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'user'@'host'[,'user'@'host'...]

REVOKE必须和FROM语句一起使用,FROM语句指明需要收回权限的账户
收回指定的权限 REVOKE priv_type[(columns)][,priv_type[(columns)]]... ON table1,table2,...ntablen FROM 'user'@'host'[,'user'@'host'...]

  • priv_type:表示权限类型
  • columns:表示权限作用于哪些列上,如果不指定,表示作用于整个表
  • table1,table2,…ntablen:表示从哪个表中收回权限
  • ‘user’@’host’:表示用户账户
? 要使用REVOKE语句,必须拥有mysql数据库的全局CREATE USER权限或UPDATE权限。
4. 查看权限 ? SHOW GRANTS语句可以显示指定用户的权限信息。
SHOW GRANTS FOR 'user'@'host'

也可以使用SELECT语句查看user表中的各个权限以确定用户的权限信息。
SELECT privileges_list FROM user WHERE user='username' AND host='hostname'

  • privileges_list 为想要查看的权限字段, 可以为select_priv、insert_priv等,根据需要选择查询的权限字段
四、访问控制 ? 当MySQL允许一个用户执行各种操作时,它将首先核实该用户向MySQL服务器发送的连接请求, 然后确认用户的操作请求是否被允许。
1. 连接核实阶段 ? 当连接MySQL服务器时,服务器基于用户的身份以及用户是否能通过正确的密码身份验证,来接受或拒绝连接。
2. 请求合适阶段 ? 建立了连接之后,服务器进入访问控制的第二阶段。对在此连接的每个请求,服务器检查用户要执行的操作,然后检查是否有足够的权限来执行它,这也正是在授权表中的权限列发挥作用的地方。
【MySQL|MySQL 用户管理】MySQL请求核实流程图
MySQL|MySQL 用户管理
文章图片

?MySQL通过向下层级的顺序检查权限表(从user表到columns_priv表),但并不是所有的权限都要执行该过程。另外,如果请求的权限操作不被允许,MySQL也不会继续检查下一层级的表。

    推荐阅读