6.1 mysql的权限系统
6.1.1 权限表
? 客户对mysql数据库的访问权限由权限表来控制,表位于mysql数据库中,
并在第一次安装mysql的过程中初始化。
? Mysql数据库权限表由6个表组成:user表、db表、host表、table_priv表、
columns_priv表、proc_priv表 1、权限表user、db和host的结构和作用 (1)user表
? Mysql中最重要的一个权限表,记录允许连接到服务器的账号信息。 ? 列出可以连接到服务器的用户及其口令,并指定他们有哪种全局权限 ? User表中启用的任何权限都是全局权限,适用于所有数据库
? Mysql5.5中,user表有42个字段,分为4类:用户列、权限列、安全列和
资源控制列
A、用户列:分别表示主机名、用户名和密码,其中user和host为联合主键。 B、权限列:包括以select_priv、insert_priv等以priv结尾的字段这些字段决定用户的权限,描述了在全局范围内允许对数据和数据库进行的操作。 C、安全列:安全列有6个字段其中2个和ssl有关(用于加密)、2个和x509有关(用于标识用户)、2个与授权插件有关(用于验证用户)。
D、资源控制列:用来限制用户使用的资源。认值为0,表示没有限制。 (2)db表和host表
? Db表中存储用户对某个数据库的操作权限,决定用户能从哪个数据库中存取
数据。
? Host表中存储了某个主机对数据库的操作权限,配合db权限表对给定主机
上数据库操作权限做更细致的控制。 注意:
? User表的权限是针对所有数据库的。
? 如果希望用户只对某个数据库有操作权限,需要将user表中对应的权限设置
为N,然后在db表中设置对应数据的操作权限。
? 用户先根据user表获取权限,然后再根据db表的内容获取权限 2、table_priv表、colunms_priv表和proc_priv表 ? table_priv表:对表设置操作权限
? colunms_priv表:对表的某一列设置操作权限 ? proc_priv表:对存储过程和存储函数设置操作权限 6.1.2 mysql权限系统的工作原理
? 当mysql允许一个用户执行各种操作时,首先核实用户向服务器发送的连接
请求,然后确认用户的操作请求是否被允许。
? Mysql的访问控制分为两个阶段:连接核实和请求核实阶段。 1、 连接核实阶段
使用user表的3个字段(host、user和password)进行身份验证,服务器只有在用户提供给主机名、用户名和密码并与user表中对应的字段值完全匹配时才能接受连接。 2、 请求核实阶段
接收到用户操作请求检查user表中权限检查db表和host表中权限检查table_priv表中权限检查column_priv表中权限是否允许用户执行该操作
6.1.3 账户管理 1、创建账户
? 创建新用户,必须有相应的权限 ? Mysql有三种方法创建新用户:
图形工具:navicat
SQL语句:create user或grant 直接操作权限表(不推荐) (1)使用navicat工具创建用户 (2)使用create user创建用户
例1使用CREATE USER创建一个用户,用户名是rjxy,密码是mypass,主机名是localhost
CREATE USER 'rjxy'@'localhost' IDENTIFIED BY 'mypass';
例2添加一个新用户,用户名为bana,密码为440432,不指定明文。 首先,使用password()获取密码的散列值: Select password(440432);
创建用户:
Create user 'bana'@'localhost'
Identified by password '*8896757F25D7B730D7A72894FE06257623CF99B9'; 验证:
A. 登录navicat界面查看用户:用户管理、user表。
B. 以bana用户登录mysql:
mysql–hlocalhost–ubana-p 打开数据库 Use stu_info;
(3)使用grant创建用户
例3使用GRANT语句创建一个新的用户testUser,密码为testuser。用户testUser对所有的数据有查询和更新权限,并授于对所有数据表的SELECT和UPDATE权限。 #创建账户并授予权限:
GRANT SELECT,UPDATE ON *.* TO 'testUser'@'localhost' IDENTIFIED BY 'testUser'; #查看账户权限信息(注意用户名区分大小写):
selecthost,user,select_priv,update_priv from mysql.user where user='testUser';
(4)直接操作mysql用户表
例4使用INSERT创建一个新账户,其用户名称为student,主机名称为localhost,密码为student: #创建用户
INSERT INTO mysql.user (Host,User,Password) VALUES('localhost','student',PASSWORD('student')); #激活用户 Flush privileges;
#查看用户信息
Select host,user from mysql.user; 2、删除账户
(1)使用navicat图形工具删除用户 (2)使用drop user删除用户
例5 使用DROP USER删除用户'rjxy'@'localhost' DROP USER 'rjxy'@'localhost'; #查看用户信息
Select host,user from mysql.user; (3)使用delete删除用户
例6 使用DELETE删除用户'student'@'localhost'
Delete FROMmysql.userWHERE host='localhost' and user='student'; #查看用户信息
Select host,user from mysql.user; 3、 修改账户名称
(1)使用navicat图形工具修改用户 (2)使用rename user修改用户 例7将用户bana的名字改为stu。
Rename user 'bana'@'localhost' to 'stu'@'localhost'; #查看用户信息
Select host,user from mysql.user; 4、修改账户密码 (1)root用户修改密码
? 使用mysqladmin命令修改密码
例8使用mysqladmin将root用户的密码修改为“rootpwd” mysqladmin -u root -p password \? 使用update命令修改密码
例9使用UPDATE语句将root用户的密码修改为“123456”: UPDATE mysql.user set Password=password(\WHERE User=\