第九章 访问控制与安全管理
9.1 用户账号管理
登录和退出MySQL服务器
mysql –h 主机名 –u 用户名 –p 用户密码
【例】使用Root用户登录到本地MySQL服务器的test库。
D:\xampp\mysql\bin>mysql -h localhost -u root -p test
其中:
1.-h 主机名,可以使用该参数指定主机名或ip
2.-u 用户名,可以使用该参数指定用户名
3.-p 密码,可以使用该参数指定登录密码,如果没有,登录时会提醒
退出:exit
MySQL的用户账号查看
MySQL的用户账号及相关信息都存储在一个名为mysql的数据库中,这个数据库里有一个名为user的数据表,包含了所有的用户账号,并且由一个名为user的列存储用户的登录名。
利用SELECT语句查看MySQL数据库的使用者账号。
SELECT user FROM mysql.user;
请注意,root账号具有对数据库所有的管理权限,因此在日常的操作中,尽量要少用root用户对数据库进行操作。
1.创建用户账号
作为一个新安装的系统,当前只有一个名为root的用户。这个用户是在成功安装mysql服务器后,由系统创建的,并且被赋予了操作和管理mysql的所有权限。
为了避免恶意用户冒名使用root账号操控数据库,通常需要创建一系列具备适当权限的账号,而尽可能地不用或少用root账号登录系统统,以此来确保数据的安全访问。
(1)使用create use创建用户账号
语法格式:
CREATE USER <用户名> [IDENTIFIED] BY [PASSWORD] <口令>
1.<用户名>:指定创建用户账号,其格式为式为'user name'@ 'host name‘
2.选项PASSWORD:用于指定散列口令,即若使用明文设置口令时,需忽略PASSWORD关键字;如果不想以明文设置口令,且知道PASSWORD()函数返回给密码的散列值,则可以在口令设置语句中指定此散列值,但需要加上关键字PASSWORD。
3.IDENTIFIED BY子句:用于指定用户账号对应的口令,若该用户账号无口令,则可省略此子句。
4.<口令>:指定用户账号的口令,在IDENTIFIED BY关键字或PASSWORD关键字之后。给定的口令值可以是只由字母和数字组成的明文,也可以是通过PASSWORD()函数得到的散列值。
【例】在MySQL服务器中添加一个新用户,其用户名为cau,主机名为localhost,用户口令设置为明文123456。
![]()
CREATE USER语句应该注意:
可以不为用户指定口令,不推荐这种做法。
使用CREATE USER语句,必须拥有MySQL中mysql数据库的INSERT权限或全局CREATE USER权限。
使用CREATE USER语句创建一个用户账号后,会在系统自身的mysql数据库的user表中添加一条新记录。
新创建的用户拥有的权限很少。可以登录到MySQL,只允许进行不需要权限的操作,如使用SHOW语句查询所有存储引擎和字符集的列表等。
如果两个用户具有相同的用户名和不同的主机名,MySQL会将他们视为不同的用户,并允许为这两个用户分配不同的权限集合。
2. 查看用户
语法格式:
select * from mysql.user where host=’host_name’ and user=‘user_name’
【例】 查看本地主机上的所有用户名。
![]()
3. 修改用户账号
rename user语句可以修改一个或多个已经存在的mysql用户账号。要使用rename user语句,必须拥有mysql数据库的update权限或全局create user权限。
语法格式:
RENAME USER<旧用户>TO<新用户>
【例】添加一个新的账号lihui,密码为111111,主机为localhost,然后修改成jinzi。

4. 修改用户口令
(1)使用mysqladmin命令来修改密码
语法格式:
mysqladmin –u username p password
【例】修改root密码为 “123456“;

(2)使用set语句来修改密码
语法格式:
set password [for 'username'@'hostname'] =password('new_password');
【例】修改xiaohong密码为'123'
![]()
5. 删除用户
(1)用drop user语句来删除普通用户
语法格式:
DROP USER <用户名1>[,<用户名2>]...
【例12】删除xiaohong用户,其host值为localhost
![]()
(2) 使用delete语句来删除普通用户
【例13】删除xiaohong用户,主机名为localhost
![]()
9.2 安全管理
查询用户的权限
当成功创建用户账户后,还不能执行任何操作,需要为该用户分配适当的访问权限。可以使用SHOW GRANT FOR语句来查询用户的权限。
注:新创建的用户只有登录MySQL服务器的权限,不能进行其他操作。
【例】利用SHOW GRANT FOR语句来查询用户“cau”的权限。
SHOW GRANTS FOR 'cau'@'localhost';
根据语句执行后的输出结果,可以看到用户'cau'仅有一个权限USAGE ON*.*,表示该用户对任何数据库和任何表都没有权限。
1.权限授予
语法格式:
GRANT <权限类型>[(<列名>)][,<权限类型>[(<列名>)]] ON <对象> <权限级别> TO <用户>
【例】授予用户“cau”对数据库studentinfo的表student,拥有列sno和列sname的SELECT权限。

【例15】当前系统中不存在用户liming和用户huang,要求创建这两个用户,并设置对应的系统登录口令,同时授予他们在数据库studentinfo的表student上拥有select和update的权限。

【例16】授予系统中已存在用户lili可以在数据库studentinfo中执行所有数据库操作的权限。

2. 权限的转移和限制
(1)转移权限
【例17】授予当前系统中一个不存在的用户zhou在数据库studentinfo的表student上拥有select和update的权限,并允许其可以将自身的这个权限授予其他用户。

(2) 限制权限
【例18】授予系统中的用户huang在数据库studentinfo的表student上每小时只能处理一条delete语句的权限。

3. 权限的撤销
第一种:
REVOKE<权限类型>[(<列名>)][,<权限类型>[(<列名>)]]... ON <对象类型><权限名>FROM<用户1>[,<用户2>]... 第二种:REVOKE ALL PRIVILEGE,GRANT OPINION FROM user <用户1>[,<用户2>]...
语法说明如下:
1.REVOKE语法和GRANT语句的语法格式相似,但具有相反的效果。
2.第一种语法格式用于回收某些特定的权限。
3.第二种语法格式用于回收特定用户的所有权限。
4.要使用REVOKE语句,必须拥有mysql数据库的全局CREATE USER权限或UPDATE权限。
【例19】回收系统中已存在的用户zhou在数据库studentinfo的表student上的select权限。


浙公网安备 33010602011771号