在用户进行验证之后,MySQL将提出以下问题验证账户权限:
1.谁是当前用户?
2.该用户有何权限?
3.这些权限适用于何处?
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 语句的子句包括:
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 语句可以修改当前会话中的活动角色列表。它接受角色列表或以下角色说明符之一:
SELECT CURRENT_ROLE() ;该函数确定当前会话中哪些角色处于活动状态。
强制性角色自动授予每个用户,使用 mandatory-roles 系统变量进行配置,在权限生效前自动激活,不会更改授权表,不能使用revoke、drop role 或 drop user 语句撤销或删除。
服务启动时读取 mandatory-roles ,优先于授权表加载这些角色,将强制角色权限注入运行时环境,最后加载常规授权表内容。
SET PERSIST mandatory_roles = '`role1`@`%`,role2,role3@localhost';
MySQL 服务器在启动时将授权表从mysql 数据库读取到内存中,并使所有访问控制决策都以这些表为依据。