MySQL是一个多用户数据库,可以为不同用户指定允许的权限。MySQL用户可以分为普通用户和root用户。
用户管理包括但不限于管理用户账户、权限等。
目录
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数据库的安全性。
使用mysql命令并在后面指定登录主机以及用户名和密码。通过mysql-help命令可以查看mysql命令。
mysql命令的常用参数
参数 | 说明 |
---|---|
-h主机名 | 指定主机名或ip,如果不指定,默认是localhost |
-u用户名 | 指定用户名 |
-p密码 | 指定登录密码。如果该参数后面有一段字段,则该段字符串将作为用户的密码直接登录。如果后面没有内容,则登录的时候会提示输入密码。注意:该参数后面的字符串和-p不能有空格 |
-P端口号 | 该参数后面接MySQL服务器的端口号,默认为3306 |
数据库名 | 可以在命令的最后指定数据库名 |
-e执行sql语句 | 如果指定了该参数,将在登录后执行-e后面的命令或sql语句并退出。 |
创建新用户,必须有相应地权限来执行创建操作。
执行CREATE USER或GRANT语句时,服务器会修改相应地用户授权表,添加或者修改用户及其权限。
CREATE USER user_specification
[,user_specification]...
user_specification:
user@host
[
IDENTIFIED BY [PASSWORD]'password'
|IDENTIFIED WITH auth_plugin[AS'auth_string']
]
CREATE USER语句会添加一个新的MySQL账户。使用CREATE语句用户,必须有全局的CREATE USER权限或MySQL数据库的INSERT权限。每添加一个用户,CREATE USER语句会在mysql.user表中添加一天新纪录,但是新创建的账户没有任何权限。如果添加的账户已经存在,CREATE USER语句会返回一个错误。
虽然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]
添加或者修改用户权限之后可以对mysql.user表进行查询,注意:user表中的user和host区分大小写,在查询的时候要指定正确的用户名称或者主机名。
其实上述的两种添加新用户的操作,实际都是在user表中添加一条新的记录。因此,可以使用INSERT语句向user表中直接插入一条记录来创建一个新的用户。使用INSERT语句,向user表中直接插入一条记录来创建一个新的用户。需要有mysql.user表的INSERT权限。
INSERT INTO mysql.user(Host,User,Password,[privilegelist])
VALUES('host','username',PASSWORD('password'),privilegevaluelist);
还要注意的是,新用户添加成功后还无法使用账号密码登录MySQL,需要使用FLUSH命令,因此执行FLUSH PRIVILEGES,使服务器重新加载授权表(重启也可以重新加载授权表)才能实现登录,使用FLUSH命令需要有RELOAD权限。
FLUSH PRIVILEGES;
使用GRANT则不需要使用FLUSH PRIVILEGES。
在MySQL数据库中,可以使用 DROP USER 语句删除用户,也可以直接通过DELETE从mysql.user表中删除对应的记录来删除用户。
DROP USER user[,user];
DROP USER语句用于删除一个或者多个MySQL账户。要使用DROP USER,必须拥有MySQL数据库的全局CREATE权限或者DELETE权限。使用与GRANT与REVOKE相同的格式为每个账户命名。
DROP USER不能自动关闭任何打开的用户对话。而且如果用户有打开的对话,此时取消用户,命令则不会生效,直到用户对话被关闭后才能生效,一旦用户对话被关闭,用户也被取消,此用户再次试图登录时将会失败
DELETE FROM mysql.user WHERE host=‘hostname’ and user=‘username’
host和user为user表中的两个字段,两个字段的组合确定所要删除的账户记录
root用户拥有最高的权限,因此root用户的安全对于MySQL非常重要。修改root用户密码的方式有多种。
mysqladmin -u username -h localhost -p password‘newpassword’
因为所有账户信息都保存在user表中,因此可以通过直接修改用户表来改变root用户的密码。root用户登录到MySQL服务器后,使用UPDATE语句修改mysql数据库的user表的password字段,从而修改用户的密码。
UPDATE mysql.user SET password=PASSWORD('newpassword')
WHERE user='roow'and host='localhost'
执行完UPDATE语句后,也需要执行FLUSH PRIVILEGES 语句重载用户权限。
SET PASSWORD 语句重新设置其他用户的登录密码或者自己使用的账户的密码。
SET PASSWORD=PASSWORD('newpassword')
root用户拥有很高的权限,不仅可以修改自己的密码,还可以修改其他用户的密码。
SET PASSWORD FOR 'user'@'host'=PASSWORD('newpassword');
同root使用UPDATE修改密码,执行UPDATE要使用FLUSH PRIVILEGES语句重新加载用户权限。
在全局级别使用GRANT USAGE语句(*.*)指定某个账户的密码而不影响账户当前的权限,使用GRANT语句修改密码,必须拥有GRANT权限,一般情况下最好使用该方法来指定或修改密码
GRANT USAGE ON \*.\* TO 'user'@'%'IDENTIFIED BY 'newpassword'
使用GRANT…IDENTIFIED BY 语句,会自动加密密码,不需要使用PASSWORD函数
普通用户登录MySQL之后,通过SET语句设置自己的密码。
SET PASSWORD=PASSWORD('newpassword');
权限管理主要是对登录到MySQL的用户进行权限验证,所有用户的权限都存储在MySQL的权限表中,不合理的权限规划会给MySQL服务器带来安全隐患。MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE权限。
账户权限信息被存储在mysql数据库中。在服务启动时,将mysql数据库中的表中权限信息的内容读入内存
不同权限下可以使用的mysqladmin命令
授权就是为某个用户授予权限。合理的授权将保证数据库的安全。
授予的权限层级
权限 | 说明 |
---|---|
全局权限 | 适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。 |
数据库层级 | 适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host 表中。 |
表层级 | 适用于一个给定表中的所有列。这些权限存储在mysql.tables_priv表中。 |
列层级 | 适用于一个给定表中的单一列。这些权限保存在 mysql.columns_priv 表中。当使用REVOKE时,必须指定与被授权列相同的列。 |
子程序层级 | 适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且CREATE ROUTINE外,这些权限可以被授予子程序层级,并存储在mysql.procs_priv |
收回权限就是取消已经赋予用户的某些权限。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'...]
要使用REVOKE语句,必须拥有mysql数据库的全局CREATE USER权限或UPDATE权限。
SHOW GRANTS语句可以显示指定用户的权限信息。
SHOW GRANTS FOR 'user'@'host'
也可以使用SELECT语句查看user表中的各个权限以确定用户的权限信息。
SELECT privileges_list FROM user WHERE user='username' AND host='hostname'
当MySQL允许一个用户执行各种操作时,它将首先核实该用户向MySQL服务器发送的连接请求, 然后确认用户的操作请求是否被允许。
当连接MySQL服务器时,服务器基于用户的身份以及用户是否能通过正确的密码身份验证,来接受或拒绝连接。
建立了连接之后,服务器进入访问控制的第二阶段。对在此连接的每个请求,服务器检查用户要执行的操作,然后检查是否有足够的权限来执行它,这也正是在授权表中的权限列发挥作用的地方。
MySQL请求核实流程图
MySQL通过向下层级的顺序检查权限表(从user表到columns_priv表),但并不是所有的权限都要执行该过程。另外,如果请求的权限操作不被允许,MySQL也不会继续检查下一层级的表。