真实用角色管理两个用户的权限,验证边界是否符合预期,再真实测试撤销角色对一个已经连接的会话到底有没有立即影响。
代码CREATE ROLE 'role_reader'; CREATE ROLE 'role_writer'; GRANT SELECT ON mysqllab.* TO 'role_reader'; GRANT SELECT, INSERT, UPDATE, DELETE ON mysqllab.* TO 'role_writer'; CREATE USER 'app_read'@'%' IDENTIFIED BY '...'; CREATE USER 'app_write'@'%' IDENTIFIED BY '...'; GRANT 'role_reader' TO 'app_read'@'%'; GRANT 'role_reader', 'role_writer' TO 'app_write'@'%'; SET DEFAULT ROLE ALL TO 'app_read'@'%', 'app_write'@'%';
app_read 尝试 INSERT: ERROR 1142: INSERT command denied to user 'app_read' app_read 执行 SELECT: 真实成功,返回8行 app_write 执行 INSERT+DELETE: 真实都成功,没有报错
角色真实把权限定义和用户账号解耦开了——不需要给每个用户重复写一遍GRANT SELECT/INSERT/UPDATE/DELETE,而是真实定义好"role_reader只读"、"role_writer读写"这两套权限模板,用户只需要真实被授予对应的角色。
代码-- app_write开一个会话,先真实确认自己有role_writer -- 这个会话保持连接不断开 -- 在root的另一个会话里,真实撤销app_write的role_writer REVOKE 'role_writer' FROM 'app_write'@'%';
已连接会话(REVOKE发生之后): INSERT INTO accounts VALUES (997,1,1); → 真实执行成功!这个已经连接的会话完全没受REVOKE影响 一个全新的连接(REVOKE发生之后): INSERT INTO accounts VALUES (996,1,1); → ERROR 1142: INSERT command denied ← 真实立刻生效
每一步都是本文上面用真实的多用户会话跑出来的原始结果。