本文为您介绍在Hologres中简单权限模型(Simple Permission Model,SPM)的使用。

简单权限模型的使用步骤

您可以按照以下步骤以SQL命令操作来完成授权,操作步骤如下:

说明 您也可以通过Hologres管控台以可视化的方式为DB开启简单权限模型并为新用户授权,详情可以参见用户授权
  1. 开启函数调用

    在开启SPM前,需要执行将函数调用的开关开启。

    create extension spm;
  2. 开启简单权限模型

    简单权限模型默认不开启,需要Superuser在需要使用简单权限模型的DB里执行开启语句:

    call spm_enable ();  // 开启当前DB的简单权限模型
    说明 为当前DB开启简单权限模型之后,必须把使用该DB的所有用户加入对应的用户组,否则这些用户将无实例的连接权限,可能对业务造成影响。
  3. 专家权限模型迁移(可选)

    若在此之前,您的DB使用的是专家权限模型,且DB中有一定数量的对象(表、视图、外表等等),需要您将原对象迁移至简单权限模型,否则会出现原对象权限缺失的情况,从而影响业务进行。在该DB执行中以下语句来迁移专家权限模型:

    call spm_migrate ();  // 将DB已有的对象change owner到develoepr,归于spm管理

    若您是新创建的DB,DB内无任何对象,可以不需要执行此步骤。

    说明 在开启简单权限模型时,需要确保当前DB没有任何SQL正在运行,否则可能会开启失败,并可能对服务产生影响。由于migrate可能涉及到将大量表进行Alter Owner操作,触发PostgreSQL对此操作的限制,spm_migrate每次仅对不超过max_locks_per_transaction的对象进行Change Owner操作,因此,您可能需要执行spm_migrate多次,直到全部对象迁移过来为止。
  4. 创建用户

    在为新用户授权之前,首先需要将新用户创建进当前实例中,若是新用户已经被创建进实例,可直接前往下一步进行用户授权。

    call spm_create_user ('云账号ID/云邮箱/RAM账号'); // 创建用户,若是子账号需要加"p4_",即"p4_uid"
    call spm_create_user ('云账号ID/云邮箱/RAM账号', '<dbname>_[admin|developer|writer|viewer]'); // 创建用户的同时把用户加入对应的用户组,若是子账号需要加"p4_",即"p4_uid"
    说明
    • 若是子账号,spm_create_user时需要额外在UID账号前加p4_,即“p4_uid”。
    • 在Hologres中,支持的子账号表达格式请参见账号
  5. 授权新用户

    成功将新用户创建进实例中后,必须在对应的DB内将新用户加入相应的用户组,以完成授权操作。

    若是在创建用户的同时已经加入对应的用户组则不需要再次授权。

    
    call spm_grant ('<dbname>_[admin|developer|writer|viewer]', '云账号id/云邮箱/RAM账号'); // 将某个用户加入某个用户组
    
    示例:
    // 加入某个DB的admin用户组
    call spm_grant ('mydb_admin', 'p4_564306222995xxx', ); // 将564306222995xxx(子账号)加入数据库mydb的admin用户组
    call spm_grant ('mydb_admin', '197006222995xxx', ); // 将197006222995xxx(主账号)加入数据库mydb的admin用户组
    call spm_grant ('mydb_admin', 'ALIYUN$xxx'); // 将xxx@aliyun.com加入数据库mydb的admin用户组
    
    // 加入某个DB的developer用户组
    call spm_grant ('mydb_developer', 'p4_564306222995xxx'); // 将564306222995xxx(子账号)加入数据库mydb的developer用户组
    call spm_grant ('mydb_developer', '197006222995xxx'); // 将197006222995xxx(主账号)加入数据库mydb的developer用户组
    call spm_grant ('mydb_developer', 'RAM$mainaccount:subuser');// 将主账号mainaccount的子账号subuser加入数据库mydb的developer用户组
    
    // 加入某个DB的viewer用户组
    call spm_grant ('"MYDB_viewer"', 'p4_564306222995xxx'); // 将564306222995xxx(子账号)加入数据库"MYDB"的viewer用户组
    call spm_grant ('"MYDB_viewer"', '197006222995xxx'); // 将197006222995xxx(主账号)加入数据库"MYDB"的viewer用户组
    call spm_grant ('mydb_viewer', '"xxx@aliyun.com"'); // 将账号xxx@aliyun.com加入数据库mydb的viewer用户组
    说明 若是子账号,需要在账号前加p4_,即“p4_uid”。
  6. 授权完成后,子账号就能使用开发工具连接当前DB并在权限范围内进行开发。

移除用户组

若因为某种原因您需要将某个用户从某个DB的某个用户组中移除,可以使用以下命令操作来完成:

call spm_revoke ('<dbname>_[admin|developer|writer|viewer]', '云账号id/云邮箱/RAM账号'); // 移除某用户的权限

示例:
// 将用户从某DB的admin用户组移除
call spm_revoke ('dbname_admin', 'p4_564306222995xxx');//将564306222995xxx(子账号)移除admin用户组
call spm_revoke ('dbname_admin', '197006222995xxx');//将197006222995xxx(主账号)移除admin用户组
call spm_revoke ('dbname_admin', '"xxx@aliyun.com"');

// 将用户从某DB的developer用户组移除
call spm_revoke ('mydb_developer', 'RAM$mainaccount:subuser'); // 将子账号subuser移出数据库mydb的developer用户组
call spm_revoke ('mydb_developer', 'p4_564306222995xxx');//将564306222995xxx(子账号)移除developer用户组

// 将用户从某个DB的viewer用户组移除
call spm_revoke ('"MYDB_viewer"', 'p4_564306222995xxx'); // 将564306222995xxx(子账号)移出数据库"MYDB"的viewer用户组
说明 你也使用Hologres管控台以可视化的方式来将用户从某个用户组移除,详见DB管理

删除用户

若因为某种原因你需要从实例中删除某个用户,你可以执行以下命令语句:

说明 删除用户成功之后,该用户将会从当前实例删除,用户将无实例任何权限,请谨慎执行该操作。
DROP ROLE "云账号ID/云邮箱/RAM账号"; // 直接将该用户从实例中删除

专家模型迁移至简单权限模型

若在此之前您的DB使用的是专家模式授权,DB中有一定数量的对象(表、视图、外表等等),为更好的管理权限需要开启简单权限模型,可以通过调用spm_migrate函数将已有对象迁移至简单权限模型,在该DB执行以下语句:

call spm_migrate ();  // 将DB已有的对象,change owner到develoepr,归于spm管理
说明 在开启简单权限模型时,需要确保当前DB没有任何SQL正在运行,否则可能会开启失败,并可能对服务产生影响。

由于migrate可能涉及到将大量表进行Alter Owner操作,但spm_migrate每次仅对不超过max_locks_per_transaction的对象进行Change Owner操作,因此可能需要您执行spm_migrate多次,直到全部对象迁移过来为止。

简单权限模型的关闭

若您因为某种原因需要关闭简单权限模型,可以按照以下操作步骤执行:

说明 您也可以在Hologres管控台以可视化的方式一键关闭简单权限模型,详情请参见DB管理
  1. 关闭简单权限模型

    开启简单权限模型后,Superuser也可以根据业务需要执行spm_disable关闭简单权限模型,在该DB执行以下语句。

    call spm_disable ();

    关于关闭简单权限模型之后,对应用户组将不会被删除,对应用户组内用户拥有的权限可以参见简单权限模型函数说明。

  2. 清除用户组

    关闭简单权限模型后,如果您需要将用户组清除,可以通过调用spm_cleanup函数来实现,分以下两种场景来删除用户组:

    说明 通常情况下,为了方便管理不建议删除用户组。
    • 场景1:删除用户组保留DB

      若由于某种原因,需要删除DB内的用户组,但同时又希望当前DB可以继续使用,superuser可以按照以下语句操作:

      call spm_cleanup ( '<dbname>' );
      说明 在调用spm_cleanup时,请确保该DB上没有SQL正在运行,否则可能会失败,并可能对服务产生影响。

      由于可能涉及到将大量业务表进行Alter Owner操作,spm_cleanup每次仅对不超过max_locks_per_transaction的对象进行Alter Owner。因此,您可能需要执行spm_cleanup多次,直到全部对象迁移过来,以及删除四个用户组为止。

    • 场景2:先删除DB再删除用户组

      若由于某种原因,已经将原有DB删除,但用户组并未删除,现需要删除对应用户组,superuser可以在另外的DB(例如postgres)执行语句:

      postgres=# call spm_cleanup ( 'mydb' );

关闭简单权限模型注意事项

  1. 只能由superuser执行关闭操作。
  2. public schema的USAGE,CREATE权限将对PUBLIC开放。
  3. DB的CONNECT,TEMPORARY权限将对PUBLIC开放。
  4. functions,procedures的EXECUTE权限将对PUBLIC开放。
  5. language, data types (include domains)的USAGE权限将对PUBLIC开放。
  6. 对于其他对象如table、view、materialized view、table column、sequence、foreign data wrapper、foreign server、schema(除public schema)等不会有权限开放给PUBLIC。
  7. 关闭之后,用户组的权限如下:
    • admin:保留对当前已有对象的权限,但对新建数据库对象不生效。
    • developer用户组:保留对当前已有对象的权限,但对新建数据库对象不生效。
    • writer用户组:保留对当前已有对象的权限,但对新建数据库对象不生效。
    • viewer用户组:保留对当前已有对象的权限,但对新建数据库对象不生效。