StarRocks的权限管理参照了MySQL的权限管理机制,支持表级别细粒度的权限控制、基于角色的权限访问控制,咱们这里整体梳理一下。
CREATE ROLE role_name;
该语句创建一个无权限的角色,后续可以通过GRANT命令赋予该角色权限。
CREATE USER user_identity [IDENTIFIED BY 'password'] [DEFAULT ROLE 'role_name'];
在StarRocks中,一个user_identity唯一标识一个用户。
user_identity:'user_name'@'host',拆分来说:
username:你将创建的用户名。
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%代替username。
password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码即可登陆服务。
role:如果指定了角色(ROLE),则会自动将该角色所拥有的权限赋予新创建的这个用户。如果不指定,则该用户默认没有任何权限。指定的 ROLE 必须已经存在。
示例:
CREATE USER 'jack';
CREATE USER jack@'172.10.1.10' IDENTIFIED BY '123456';
为了避免传递明文,上述示例也可以使用下面的方式来创建:
先通过PASSWORD()计算出加密后的密码,例如:
SELECT PASSWORD('123456');
得到结果为:*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
创建用户:
CREATE USER jack@'172.10.1.10' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
在登录时,我们还需使用未加密前的密码登录。
CREATE USER 'jack'@'192.168.%' DEFAULT ROLE 'example_role';
CREATE USER 'jack'@'%' IDENTIFIED BY '123456' DEFAULT ROLE 'my_role';
DROP ROLE role_name;
删除一个角色不会影响之前属于该角色的用户的权限,仅相当于将该角色与用户解耦,而用户已经从该角色获取到的权限维持不变。
DROP USER 'user_identity';
依据user_identity删除用户帐号,例如删除用户jack@'192.%':
DROP USER 'jack'@'192.%';
1)查看已创建的所有角色
展示所有已创建的角色信息,包括角色名称,包含的用户以及权限:
SHOW ROLES;
2)查看当前用户角色[不支持]
1)查看所有用户
SHOW ALL GRANTS;
SHOW PROC '/auth';
2)查看当前用户
SELECT CURRENT_USER(); --显示用户
SELECT USER(); --显示用户及访问客户端的IP
GRANT privilege_list ON db_name[.tbl_name] TO user_identity;
GRANT privilege_list ON RESOURCE resource_name TO user_identity;
1)privilege_list
是需要赋予的权限列表,以逗号分隔。当前StarRocks支持的权限基本分为三类:
节点权限:NODE_PRIV
库表权限:SELECT_PRIV,LOAD_PRIV,ALTER_PRIV,CREATE_PRIV,DROP_PRIV,ALL(前面所有)
资源权限:USAGE_PRIV
具体权限介绍:
NODE_PRIV:集群节点操作权限,包括节点上下线等操作,只有root用户有该权限,不可赋予其他用户。
ADMIN_PRIV:除NODE_PRIV以外的所有权限。
GRANT_PRIV:操作权限的权限。包括创建删除用户、角色,授权和撤权,设置密码等。
SELECT_PRIV:对指定的库或表的读取权限(Select操作)。
LOAD_PRIV:对指定的库或表的导入权限(Insert或Delete操作)。
ALTER_PRIV:对指定的库或表的schema变更权限。(Alter操作)
CREATE_PRIV:对指定的库或表的创建权限(Create Table或Create View操作)。
DROP_PRIV:对指定的库或表的删除权限。
USAGE_PRIV:对指定资源的使用权限[参见Spark Load章节]。
2)db_name[.tbl_name]
授予权限的数据库及表,支持以下三种形式:
*.* 权限可以应用于所有库及其中所有表
db.*权限可以应用于指定库下的所有表
db.tbl权限可以应用于指定库下的指定表
3)user_identity
语法同CREATE USER。且必须为使用CREATE USER创建过的user_identity。其中的host可以是域名,如果是域名,权限的生效时间可能会有约1分钟的延迟。
示例:
GRANT SELECT_PRIV ON *.* TO 'jack'@'%';
GRANT SELECT_PRIV,ALTER_PRIV,LOAD_PRIV ON db1.tbl1 TO 'jack'@'192.8.%';
GRANT USAGE_PRIV ON RESOURCE * TO 'jack'@'%';
GRANT USAGE_PRIV ON RESOURCE 'spark_resource' TO 'jack'@'%';
4)权限查看
查看当前用户权限:
SHOW GRANTS;
查看所有用户权限:
SHOW ALL GRANTS;
查看指定用户权限:
SHOW GRANTS FOR user_identity;
类似上文授予用户权限,将权限赋予指定的ROLE,如果指定的ROLE不存在,则会自动创建。
GRANT privilege_list ON db_name[.tbl_name] TO ROLE 'role_name';
GRANT privilege_list ON RESOURCE resource_name TO ROLE 'role_name';
例如:
授予指定库的所有表的导入权限给角色
GRANT LOAD_PRIV ON db1.* TO ROLE 'my_role';
授予指定资源的使用权限给角色
GRANT USAGE_PRIV ON RESOURCE 'spark_resource' TO ROLE 'my_role';
REVOKE privilege_list ON db_name[.tbl_name] FROM user_identity;
REVOKE privilege_list ON RESOURCE resource_name FROM user_identity;
user_identity:语法同CREATE USER,且必须为使用CREATE USER创建过的user_identity。user_identity中的host可以是域名,如果是域名,权限的撤销时间可能会有约1分钟的延迟。
示例:
撤销用户jack关于数据库db1的权限
REVOKE SELECT_PRIV ON db1.* FROM 'jack'@'192.%';
撤销用户jack使用资源spark_resource的权限
REVOKE SELECT_PRIV ON db1.* FROM 'jack'@'192.%';
REVOKE privilege_list ON db_name[.tbl_name] FROM ROLE 'role_name';
REVOKE privilege_list ON RESOURCE resource_name FROM ROLE 'role_name';
按角色撤销权限时,role_name需指向已存在的角色。
当前只能在新建用户时指定对应角色。
SET PASSWORD [FOR user_identity] = [PASSWORD('plain password')]|['hashed password'];
SET PASSWORD命令可以修改一个用户的登录密码。如果[FOR user_identity]字段不存在,那么修改当前用户的密码。注意这里的user_identity必须完全匹配在使用CREATE USER创建用户时指定的user_identity,否则会报错用户不存在。如果不指定user_identity,则当前用户为'username'@'ip',这个当前用户,可能无法匹配任何user_identity。
修改其他用户的密码,需要具有管理员权限。
修改密码时,也可以使用PASSWORD()函数将明文密码转换为加密的密码。如果不使用PASSWORD()函数,则需要直接指定加密后的密码。
SET PASSWORD = PASSWORD('123456');
或:
SELECT PASSWORD('123456');
得到结果为:*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
设置密码:
SET PASSWORD = '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
SET PROPERTY [FOR 'user'] 'key' = 'value' [, 'key' = 'value']
这里设置的用户属性,是针对user的,而不是user_identity。目前该参数主要用于修改用户的最大连接数,例如:
修改用户jack最大连接数为1000:
SET PROPERTY FOR 'jack' 'max_user_connections' = '1000';
SHOW PROPERTY FOR 'user';