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

权限元数据存储位置:
权限类型元数据存储-系统表用户全局权限mysql.user数据库(DB)权限mysql.db表(table)权限mysql.tables_priv列(columns)权限mysql.columns_privroutine-level(procedures and functions)权限mysql.procs_priv代理(proxy)用户权限mysql.proxies_privTips:值得注意的是,在某些情况下,无论是 CREATE|ALTER USER 还是 GRANT 都可能会记录在服务器日志中或客户端的历史文件中 , 例如 ~/.mysql_history , 这就意味着任何有权读取该信息的人都可以读取明文密码 , 这不就暴露了吗 。 二、瞅瞅其他数据库的用户角色管理1、SQL Server的用户角色服务器级别角色:

  • 全局权限 , 只登入名(如超级管理员的登录名是sa)拥有;
  • 服务器角色是固定的(包括:sysadmin、setupadmin、serveradmin等),用户无法创建服务器角色,一般也不建议给用户直接分配服务器角色 。
数据库级别角色:
  • 作用域为数据库,拥有者可以是用户也可以是数据库角色本身,可以理解数据库角色就是一组相同权限的用户;
  • 两种类型的数据库级角色:数据库中预定义的“固定数据库角色(fixed-database roles)”(包括:db_owner、db_ddladmin、db_datawriter等)和可以创建的“用户定义数据库角色(user-defined database roles)” 。
  • 请不要将用户定义的数据库角色添加为固定角色的成员,否则会导致意外的权限升级 。
应用程序角色:
  • 一个数据库级主体,使应用程序能够用其自身的、类似用户的权限来运行,可以只允许通过特定应用程序连接的用户访问特定数据;
  • 与数据库角色不同的是,应用程序角色默认情况下不包含任何成员,而且是非活动的;
  • 默认应用程序角色无法访问服务器级元数据,因为它们不与服务器级主体关联,通过设置全局标志 4616 可放开限制 。
用户:
  • 数据库用户必须绑定具体的登入名 , 也可以在新建登入名的时候绑定此登入名拥有的数据库,默认就创建了此登入名同名的数据库用户,登入名与数据库用户之间就存在关联关系;
  • 数据库用户是架构和数据库角色的拥有者,即可以将某个架构分配给用户,那么该用户就拥有了该架构所包含的对象;也可以将某个数据库角色分配给用户,此用户就拥有该数据库角色的权限 。
# 创建登录名[stu],并为登录名指定用户[student_user]create user student_user for login stu;# 创建角色[student_role]并为角色授权create role student_role;grant select, update, insert on db_book to student_role;# 将角色授予用户:student_role授予student_userexec sp_addrolemember@rolename='student_role',@membername='student_user'; 2、OceanBase的用户角色角色管理:
  • 角色是为用户赋予各种权限的一种对象,为多种权限的集合,使用角色可将一组具有相同权限的用户组织在一起;
  • 内置角色:ODC(OceanBase Developer Center,OB开发者中心) 中内置了管理员角色 system_admin ,该角色被自动赋予给管理员用户 admin ,该角色可进行系统有关的所有操作且默认可访问所有的公共资源和个人资源 , 该角色不支持被编辑、删除和停用;
  • 自定义新建角色:通过 ODC 新建角色,可支持设置 公共资源权限 和 个人资源权限 。
用户管理:
  • 内置用户:ODC 中已内置一个管理员账户 admin ,该账户被自动设置为了管理员角色 system_admin ,所以该账户可进行系统有关的所有操作且默认可访问所有的公共资源,该账户不支持被编辑、删除和停用;
  • 自定义新建用户:新建用户操作包括指定用户信息、为新建用户指定角色等,同时可在 ODC 中对用户进行查看、编辑等相关管理操作 。
 三、再看MySQL 8.0的用户角色管理1、创建角色并授权# 1.创建角色:创建三个角色,分别作为[app_db]的owner、read、write角色CREATE ROLE 'app_owner', 'app_read', 'app_write';# 2.角色授权:按功能分别给不同角色授权GRANT ALL ON app_db.* TO 'app_owner';GRANT SELECT ON app_db.* TO 'app_read';GRANT INSERT, UPDATE, DELETE ON app_db.* TO 'app_write';# 3.创建用户:根据业务需求创建三个用户CREATE USER admin_user IDENTIFIED BY 'xxx_pass1';CREATE USER read_user1 IDENTIFIED BY 'xxx_pass2';CREATE USER read_user2 IDENTIFIED BY 'xxx_pass3';CREATE USER rw_user1 IDENTIFIED BY 'xxx_pass4';# 4.用户分配角色:对应的为用户授予角色GRANT 'app_owner' TO admin_user;GRANT 'app_read' TO read_user1, read_user2;# 授权读和写角色,即授权rw_user1用户读写权限 ---> 一个用户可以拥有多个角色,也就拥有这多个角色的权限集合GRANT 'app_read', 'app_write' TO rw_user1;# 'app_owner', 'app_read', 'app_write' 三个角色在 mysql.user 中 password_expired、account_locked 都是 Y ,说明角色在 user 表作为"角色"的存在;# mysql.db 中 Db: app_db 的权限划分,是按照三个角色来的(即角色授权),并没有因为用户分配了角色之后又给到用户mysql> show grants for app_read;+----------------------------------------------+| Grants for app_read@%|+----------------------------------------------+| GRANT USAGE ON *.* TO `app_read`@`%`|| GRANT SELECT ON `app_db`.* TO `app_read`@`%` |+----------------------------------------------+2 rows in set (0.07 sec)mysql> show grants for rw_user1;+--------------------------------------------------------+| Grants for rw_user1@%|+--------------------------------------------------------+| GRANT USAGE ON *.* TO `rw_user1`@`%`|| GRANT `app_read`@`%`,`app_write`@`%` TO `rw_user1`@`%` |+--------------------------------------------------------+2 rows in set (0.06 sec)

推荐阅读