在用户进行验证之后,MySQL将提出以下问题验证账户权限:
1.谁是当前用户?
2.该用户有何权限?
- 管理权限比如:shutdown、replication slave、load data infile。
- 数据权限比如:select、insert、update、delete。
3.这些权限适用于何处?
- global、database、table、column、stored routine(存储例程包括存储过程和存储函数)。
grant语句
1.grant语句为mysql用户账户和角色分配权限或角色:
world数据库的所有权限授予r_viewer角色
GRANT SELECT ON world.* TO r_viewer;
world数据库的city表的更新删除权限授予kari用户
GRANT UPDATE, DELETE ON world.city TO kari@localhost;
grant 语句的子句包括:
- 要授予的权限:select、update、delete等。
- 权限级别:全局:*.* ;数据库:db_name.* ;表:db_name.table_name ;存储例程:db_name.routine_name。
- 被授予权限的账户或角色。
2.指定列权限:
kari有权限读取mysql.user表中的user和host列
GRANT SELECT(user,host) ON mysql.user TO kari@localhost;
3.在同一语句中可以应用表级和列级权限:
r_updater角色可以更新world.country表中的Name列,还可以删除该表
GRANT UPDATE(Name), DELETE ON world.country TO r_updater;
4.将角色授予mysql用户账户和其他角色时,grant语句不带ON子句:
r_viewer, r_updater角色授予r_world角色
GRANT r_viewer, r_updater TO r_world;
r_viewer, r_updater角色授予kari用户,并且kari可以将角色授予其他用户账户
GRANT r_viewer, r_updater TO kari@localhost WITH ADMIN OPTION;
5.显示自己的账户权限:show grants / show grants for current_user();
6.显示其他用户权限:show grants for user@host;
7.显示角色的权限:show grants for 角色名;
用户权限限制
- 在指定用户权限时,采用“白名单”模式,只能指定它可以干什么,不能显式指定它不能干什么。()
- 不能授予行级权限。
撤销账户权限
revoke语句可以从用户账户和角色中撤销权限和角色。on子句指定要撤销的级别,from子句指定账户名或角色名。在发出 revoke 之前,一定要使用 show grants 语句来确定要撤销哪些权限和角色, 之后再次确认结果是否正确。
特殊权限
usage说明符授予连接到服务器的能力。这是新帐户的默认权限级别,可以使用该帐户访问服务器用于有限的目的,例如发出SHOW VARIABLES 或SHOW STATUS。不能使用帐户访问表之类的数据库内容,但可在以后授予此类权限。
REVOKE USAGE FROM kari@localhost
MySQL的访问控制分为两个独立层面:
连接认证层(能否登录)
-
由
mysql.user
表中的账户记录控制 -
检查密码、账户锁定状态、认证插件等
操作权限层(能做什么)
-
由各种权限表(
tables_priv
等)控制 -
USAGE属于这一层
该语句撤销了kari用户的usage权限,不会阻止用户登录服务器。
激活角色权限
用户在使用被授予的角色权限之前,必须要先激活权限。
1.在服务器级别激活角色
SET PERSIST activate_all_roles_on_login = ON;
将 activate_all_roles_on_login 系统变量默认值为OFF,若设置为ON,服务器在登录时将激活授予每个账户的角色。
2.在用户级别激活
SET DEFAULT ROLE r_viewer, r_updater TO kari@localhost;
SET DEFAULT ROLE ALL TO kari@localhost, Jan@localhost;
SET DEFAULT ROLE 语句定义当用户连接到服务器时哪些角色变为活动角色.
或者,在CREATE USER 或ALTER USER 语句中使用DEFAULT ROLE 子句:
ALTER USER kari@localhost DEFAULT ROLE r_viewer, r_updater;
ALTER USER kari@localhost DEFAULT ROLE ALL;
用户级默认角色存储在 mysql.default_roles 授权表中。用户登录时会检查该表,使用记录的角色权限。
3.在会话级别激活角色
SET ROLE 语句可以修改当前会话中的活动角色列表。它接受角色列表或以下角色说明符之一:
- DEFAULT:激活帐户默认角色
- NONE:禁用所有角色
- ALL:激活授予该帐户的所有角色
- ALL EXCEPT:激活授予帐户的所有角色,但指定的角色除外。
SELECT CURRENT_ROLE() ;该函数确定当前会话中哪些角色处于活动状态。
强制性角色
强制性角色自动授予每个用户,使用 mandatory-roles 系统变量进行配置,在权限生效前自动激活,不会更改授权表,不能使用revoke、drop role 或 drop user 语句撤销或删除。
服务启动时读取 mandatory-roles ,优先于授权表加载这些角色,将强制角色权限注入运行时环境,最后加载常规授权表内容。
SET PERSIST mandatory_roles = '`role1`@`%`,role2,role3@localhost';
授权表
MySQL 服务器在启动时将授权表从mysql 数据库读取到内存中,并使所有访问控制决策都以这些表为依据。
主要授权表清单
- 避免直接在授权表中修改用户帐户,直接更改授权表时犯错,则可能会将所有用户锁在系统外面,如果直接修改了授权表,应通过发出 FLUSH PRIVILEGES 语句显式重新装入授权表。
- 帐户修改语句(如GRANT、REVOKE、SET PASSWORD 和RENAME USER)会将更改同时应用于授权表及其内存中表。
- 对全局权限和口令的更改仅应用于该帐户的后续连接。
- 对数据库级别权限的更改在客户机的下一此使用 USE db_name 语句后应用。
- 对角色、表、列和例程权限的更改会立即应用。