MySQL用户也可以是个角色( 四 )

这就结束了?
# 使用 [read_user1] 用户登录$ mysql -u read_user1 -p# 并没有已授权的[app_db]mysql> show databases;+--------------------+| Database|+--------------------+| information_schema |+--------------------+1 row in set (0.00 sec)# 当前也没有任何角色生效mysql> SELECT CURRENT_ROLE();+----------------+| CURRENT_ROLE() |+----------------+| NONE|+----------------+1 row in set (0.00 sec)当然 , 没有结束 , 默认情况前面创建的角色并未被激活 , 最后一步是还需要“激活角色”:
# 5.激活角色:即设置用户的默认角色 , 前提是用户有分配角色(前第4步)# 设置用户 [admin_user] 登录的默认角色是 {app_owner}SET DEFAULT ROLE 'app_owner' TO admin_user;# 一步到位:SET DEFAULT ROLE ALL , 指的是将用户所有的角色都设置为默认角色SET DEFAULT ROLE ALL TO admin_user, read_user1, read_user2, rw_user1;# 查看默认角色设置mysql> select * from mysql.default_roles;+------+------------+-------------------+-------------------+| HOST | USER| DEFAULT_ROLE_HOST | DEFAULT_ROLE_USER |+------+------------+-------------------+-------------------+| %| admin_user | %| app_owner|| %| read_user1 | %| app_read|| %| read_user2 | %| app_read|| %| rw_user1| %| app_read|| %| rw_user1| %| app_write|+------+------------+-------------------+-------------------+5 rows in set (0.06 sec)# 若要删除默认角色设置:SET DEFAULT ROLE none TO user_name;# 另一种激活角色方式:通过设置 activate_all_roles_on_login = ON , 实现用户登录时自动激活角色2、会话间的角色互换拥有多角色的用户 , 在当前会话里可以进行角色互换:SET ROLE role_name;$ mysql-u rw_user1 -p# 如前设置 , 激活默认是全部角色mysql> select current_role();+--------------------------------+| current_role()|+--------------------------------+| `app_read`@`%`,`app_write`@`%` |+--------------------------------+1 row in set (0.05 sec)# 切换到角色 {app_read}mysql> set role app_read;Query OK, 0 rows affected (0.05 sec)mysql> select current_role();+----------------+| current_role() |+----------------+| `app_read`@`%` |+----------------+1 row in set (0.06 sec)# app_read 角色是只读权限 , insert操作是被拒绝的mysql> insert into app_db.t1(id) values(1);ERROR 1142 (42000): INSERT command denied to user 'rw_user1'@'10.99.17.133' for table 't1'# 切换到角色 {app_write}mysql> set role app_write;Query OK, 0 rows affected (0.05 sec)mysql> select current_role();+-----------------+| current_role()|+-----------------+| `app_write`@`%` |+-----------------+1 row in set (0.05 sec)# 切换到 app_write 角色是有插入权限 , insert成功mysql> insert into app_db.t1(id) values(1);Query OK, 1 row affected (0.10 sec)3、何为强制角色mandatory_roles:强制所有用户默认角色 , 可以通过在 mandatory_roles 系统变量的值中命名角色 , 可以将角色指定为强制角色  , 服务器将强制角色视为授予所有用户 , 因此无需明确授予任何帐户 。# 设置强制给所有用户赋予角色{app_read}mysql> set global mandatory_roles = 'app_read';Query OK, 0 rows affected (0.06 sec)# 顺便设置默认激活角色mysql> set global activate_all_roles_on_login = on;Query OK, 0 rows affected (0.06 sec)# 创建新用户[kuzma]mysql> CREATE USER kuzma IDENTIFIED BY 'xxx';Query OK, 0 rows affected (0.06 sec)# 用户[kuzma]登录$ mysql -u kuzma -p# 查看用户权限 , 是被挂上了"强制角色"{app_read}的> show grants;+-------------------------------------------+| Grants for kuzma@%|+-------------------------------------------+| GRANT USAGE ON *.* TO `kuzma`@`%`|| GRANT SELECT ON `app_db`.* TO `kuzma`@`%` || GRANT `app_read`@`%` TO `kuzma`@`%`|+-------------------------------------------+3 rows in set (0.05 sec)4、撤销/删除角色# 撤销角色 , 从用户上拿掉某一角色 , 即同时的撤销该角色拥有的权限集合REVOKE role_name FROM user_name;# 回收角色上的授权(和旧时的用户回收权限类似)REVOKE DELETE ON db_name.* FROM role_name;# 删除角色DROP ROLE role_name1, role_name2;

经验总结扩展阅读