# 用户和权限
# 相关知识
为了完成本关任务,你需要掌握:
- MySQL 的安全控制机制
- create user 语句的使用
- grant 和 revoke 语句的使用。
# MySQL 的安全控制机制
与大多数商用 DBMS 一样,MySQL 采用自主存取控制 (DAC) 机制进行安全性管理。通过用户,数据对象,权限,授权,收回权限等要素进行存取控制。另外,为了方便批量授权给同一类用户,引入了角色。
# 用户 (User)
MySQL 创建用户的语句:
create user 用户名 identified by 用户登录密码; |
通常用户名可包含域名,限定用户在该域名内登录再有效。例:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password'; |
该语句创建用户 jeffrey
, 密码为 'password'
,仅限在 MySQL 服务器本机上登录才有效。用户名与域合起来,被称为账户 (account)。
注意不要写成: 'jeffrey@localhost'
,它代表账户: 'jeffrey@localhost'@'%'
,意即用户名为 jefrrey@localhost
,在任何机器上登录都有效。两者的含义完全不同。
省略域名,即默认为 '%'
, 表示用户可远程登录。在本实训中,可以省略域,这时,用户名可以不加引号。
drop user 语句可删除用户。用户被删除时,该用户拥有的权限自动被收回。
alter user 语句可重置用户密码:
ALTER USER user IDENTIFIED BY 'new_password'; |
MySQL 在安装时,初始用户名为 root,此为系统管理员用户,其余用户均由 root 创建,并授权。经授权的用户也可以创建用户。
在生产环境中,除了管理员,其它人应当使用由管理员创建的账户,不得使用 root 帐户。出于安全考虑,一般 root 用户也仅限在服务器本地登录,不轻易开放远程登录。
# 权限
MySQL 常用的权限有:
- all: 所有权限 (grant option 除外)
- alter: alter table 权限
- alter routine: alter 存储过程
- create: create database/table
- create role: create role
- create foutine: create 存储过程和函数
- create user: create/alter/rename/drop user
- create view: create view
- delete: delete 语句
- drop: drop database/table
- drop role: drop role
- execute: 调用存储过程或函数
- index:create/drop index
- insert: insert 语句
- select: select 语句
- trigger: 触发器相关操作
- update: update 语句 等。 select,update,insert,delete 还可以用在列上,如 select (c_id),update (b_balance) 等。
# 角色 (Role)
角色是权限的集合。如果有一组人 (承担相同职责的小组,或者説小组成员扮演相同的角色) 应该被授予一组相同的权限,不妨创建一个角色,将那组权限授予该角色,然后再将角色授予该组的每个成员。这比一个个地给每个组员授予一批权限要方便得多。
创建角色的语句:
CREATE ROLE [IF NOT EXISTS] role [, role ] ... |
一次可以创建多个角色。
删除角色:
DROP ROLE [IF EXISTS] role [, role ] ... |
角色被删除后,拥有该角色的用户立即失去角色定义的权限组合。不过,如果用户同时拥有多个角色,两个角色代表的权限集合如果有交集,则该用户仍拥有交集代表的权限。
# GRANT 授权语句
以下语句授予权限给用户或角色:
grant 权限[,权限] ... on 数据库对象 to user|role,[user|role]... [with grant option] |
可以同时将多个权限授予多个用户或角色。
with grant option
表示被授权用户可以传播权限,即授权该用户将其拥有的权限(之前获得的权限,通过本语句获得的权限,以及今后获得的权限)再授予其它用户。
以下语句授予角色所代表的权限集给用户或角色:
GRANT role [, role] ... TO user_or_role [, user_or_role] ... [WITH ADMIN OPTION] |
总之,GRANT 语句可以将权限或角色(权限集合)授予用户或角色。但是不能将权限和角色混合授予用户 (或角色)。不过,你可以分开用两条不同的 GRANT 语句来实现:直接授权语句有关键词 ON,间接授权 (角色代表的权限集合) 语句不带 ON 关键词。
# REVOKE 收回权限语句
以下语句将对象的权限从用户或角色手中收回:
revoke 权限[,权限]... on 数据库对象 from user|role[,user|role]... |
下列语句把 role 所代表的权限集合从用户或角色中收回:
REVOKE role [, role ] ... FROM user_or_role [, user_or_role ] ... |
如果用户本身拥有多个角色所代表的权限集合,而这些集合存在交集,收回其中部分角色代表的权限集后,用户可能仍拥有那个角色所代表的部分权限 (交集代表的那部分权限)。
# 编程要求
在右侧代码文件编辑器填写语句,完成以下创建用户和授权操作:
- 创建用户 tom 和 jerry,初始密码均为 '123456';
- 授予用户 tom 查询客户的姓名,邮箱和电话的权限,且 tom 可转授权限;
- 授予用户 jerry 修改银行卡余额的权限;
- 收回用户 Cindy 查询银行卡信息的权限。
说明:
- 本实训的运行环境是之前查询实训中曾经使用过的金融场景数据库。
- 除 root 用户外,已预设了一个名为 Cindy 的用户,Cindy 已被 root 授予了一定权限。
- 由于 MySQL 的用户密码采用加密存储,不可识别,评测程序不会也无法比较密码是否按要求设置,实际上密码可以任意设置。如果你想用创建的用户在命令行登录到 MySQL 检验的话,自己记得所设密码即可。
- 命令行窗口与评测用的是不同的 MySQL 实例,你需要自己还原数据库 (/data/workspace/myshixun/src/test1/finance1.sql)
附上相关表结构:
# 请填写语句,完成以下功能: | |
#(1) 创建用户 tom 和 jerry,初始密码均为 '123456'; | |
create user tom identified by "123456"; | |
create user jerry identified by "123456"; | |
#(2) 授予用户 tom 查询客户的姓名,邮箱和电话的权限,且 tom 可转授权限; | |
grant select (c_mail, c_name, c_phone) on client to tom with grant option; | |
#(3) 授予用户 jerry 修改银行卡余额的权限; | |
grant update (b_balance) on bank_card to jerry; | |
#(4) 收回用户 Cindy 查询银行卡信息的权限。 | |
revoke select on bank_card from Cindy; |
# 用户、角色与权限
# 编程要求
在右侧代码文件编辑器填写语句,完成以下创建用户和授权操作:
- 创建角色 client_manager 和 fund_manager;
- 授予 client_manager 对 client 表拥有 select,insert,update 的权限;
- 授予 client_manager 对 bank_card 表拥有查询除银行卡余额外的 select 权限;
- 授予 fund_manager 对 fund 表的 select,insert,update 权限;
- 将 client_manager 的权限授予用户 tom 和 jerry;
- 将 fund_manager 权限授予用户 Cindy.
说明:
在本关开始前,用户 Cindy,tom,jerry 的所有权限都已提前被 revoke。
# 请填写语句,完成以下功能: | |
# (1) 创建角色 client_manager 和 fund_manager; | |
create role client_manager; | |
create role fund_manager; | |
# (2) 授予 client_manager 对 client 表拥有 select,insert,update 的权限; | |
grant select, insert, update on client to client_manager; | |
# (3) 授予 client_manager 对 bank_card 表拥有查询除银行卡余额外的 select 权限; | |
grant select (b_c_id, b_number, b_type) on bank_card to client_manager; | |
# (4) 授予 fund_manager 对 fund 表的 select,insert,update 权限; | |
grant select, insert, update on fund to fund_manager; | |
# (5) 将 client_manager 的权限授予用户 tom 和 jerry; | |
grant client_manager to tom, jerry; | |
# (6) 将 fund_manager 权限授予用户 Cindy. | |
grant fund_manager to Cindy; |