Skip to content

22.数据库权限

通过网络连接服务器的客户对MySQL数据库的访问由权限表内容来控制。这些表位于MySQL数据库中,并在第1次安装MySQL的过程中初始化。权限表共有6个表:user、db、host、tables_priv、 columns_priv和procs_priv。 当MySQL服务启动时,会首先读取MySQL中的权限表,并将表中的数据装入内存。当用户进行存取操作时,MySQL会根据这些表中的数据做相应的权限控制。

  • IP :访问数据库ip地址

  • 用户 :访问数据库的用户

  • 数据库: 访问哪个数据库

  • 表的权限: (查询、修改、插入、杉树)

  • 字段

  • 存储过程的权限


-- 系统权限表
SELECT * FROM USER ;
SELECT * FROM db;
SELECT * FROM columns_priv;
SELECT * FROM tables_priv;
SELECT * FROM procs_priv;

权限的执行机制

为了确保数据库的安全性与完整性,系统并不希望每个用户可以执行所有的数据库操作。当MySQL允许一个用户执行各种操作时,它将首先核实用户向MySQL服务器发送的连接请求,然后确认用户的操作请求是否被允许。 MySQL的访问控制分为两个阶段: 连接核实阶段 请求核实阶段

连接核实阶段

当用户试图连接MySQL服务器时,服务器基于用户提供的信息来验证用户身份,如果不能通过身份验证,服务器会完全拒绝该用户的访问。如果能够通过身份验证,则服务器接受连接,然后进入第2个阶段等待用户请求。 MySQL使用user表中的3个字段(Host、User和Password)进行身份检查,服务器只有在用户提供主机名、用户名和密码并与user表中对应的字段值完全匹配时才接受连接。新版本中Password字段名改为authentication_string。

请求核实阶段

一旦连接得到许可,服务器进入请求核实阶段。在这一阶段,MySQL服务器对当前用户的每个操作都进行权限检查,判断用户是否有足够的权限来执行它。用户的权限保存在user、db、host、tables_priv或columns_priv权限表中。 在MySQL权限表的结构中,user表在最顶层,是全局级的。下面是db表和host表,它们是数据库层级的。最后才是tables_priv表和columns_priv表,它们是表级和列级的。低等级的表只能从高等级的表得到必要的范围或权限。 确认权限时,MySQL首先检查user表,如果指定的权限没有在user表中被授权,MySQL服务器将检查db表和host表,在该层级的SELECT权限允许用户查看指定数据库的所有表的数据。如果在该层级没有找到限定的权限,则MySQL继续检查tables_priv表以及columns_priv表。如果所有权限表都检查完毕,依旧没有找到允许的权限操作,MySQL服务器将返回错误信息,用户操作不能执行,操作失败。

用户创建

创建新用户

使用CREATE USER语句创建新用户。 执行CREATE USER或GRANT语句时,服务器会有相应的用户权限表,添加或修改用户及其权限。 CREATE USER语句的基本语法格式如下。

CREATE USER user [IDENTIFIED BY [PASSWORD]'password'] [,user[IDENTIFIED BY [PASSWORD]'password']][,…];

sql
-- 创建数据库用户  -- 数据库中保存的密码 *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B 
CREATE USER myuser IDENTIFIED  BY 'root';

SELECT * FROM USER;

CREATE USER myuser2@'192.168.0.102' IDENTIFIED  BY 'root';

CREATE USER myuser3@'%' IDENTIFIED  BY 'root';

使用grant语句创建用户并授权

创建新用户 使用GRANT语句创建新用户。 GRANT语句不仅可创建新用户,还可以在创建的同时对用户授权。GRANT语句还可以指定用户的其他特点,如安全连接、限制使用服务器资源等。使用GRANT语句创建新用户时必须有GRANT权限。 其基本语法格式如下。 GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] [,…] [WITH GRANT OPTION];

删除用户

-- 删除用户
--  myuser2  只有  192.168.0.102 
-- DROP USER 'myuser2' 会报错  Operation DROP USER failed for 'myuser2'@'%'
DROP USER 'myuser2'@'192.168.0.102';

--  针对不用ip 可以设置不同密码
CREATE USER myuser5@'192.168.0.102' IDENTIFIED  BY 'root1';
CREATE USER myuser5@'192.168.0.103' IDENTIFIED  BY 'root2';

修改用户

sql
修改用户名
使用RENAME USER语句修改用户。
基本语法格式如下。
RENAME USER old_user TO new_user,
                [, old_user TO new_user] [,…];
将用户haha的名字分别修改为haha2。
mysql> rename user haha@localhost to haha2@localhost;

修改密码

sql
修改密码
使用SET语句修改密码。
基本语法格式如下。
SET  PASSWORD [FOR user]= PASSWORD('newpassword');
将用户king的密码修改为queen1。
SET PASSWORD FOR ‘king’@‘localhost’ =PASSWORD(‘queen1');
将root用户的密码修改为123456。
	SET PASSWORD =PASSWORD('123456');

收回权限

sql
收回所有权限。其基本语法如下。
REVOKE ALL PRIVILEGES,GRANT OPTION
FROM 'username'@'hostname'[,'username'@'hostname'][,…n];

使用REVOKE语句收回grantUser用户的的所有权限,包括GRANT权限。
	mysql> revoke all privileges,grant option from grantUser@localhost;

查看权限

Released under the MIT License.