数据库角色(ROLE)
CQL使用数据库角色来表示用户和用户组。角色定义语法为:
role_name ::=identifier
|string
创建角色(ROLE)
创建角色使用CREATE ROLE语句:
create_role_statement ::= CREATE ROLE [ IF NOT EXISTS ]role_name
[ WITHrole_options
] role_options ::=role_option
( ANDrole_option
)* role_option ::= PASSWORD '='string
| LOGIN '='boolean
| SUPERUSER '='boolean
| OPTIONS '='map_literal
例如:
CREATE ROLE new_role;
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true;
CREATE ROLE bob WITH PASSWORD = 'password_b' AND LOGIN = true AND SUPERUSER = true;
CREATE ROLE carlos WITH OPTIONS = { 'custom_option1' : 'option1_value', 'custom_option2' : 99 };
默认角色不具有LOGIN权限或SUPERUSER状态。
数据库资源的权限授予角色;资源类型包括密钥空间,表,函数和角色本身。角色可以授予其他角色以创建分层权限结构;在这些层次结构中,权限和SUPERUSER状态是继承的,但LOGIN权限不是。
如果角色具有LOGIN权限,则客户端可以在连接时标识为该角色。在该连接的持续时间内,客户端将获得授予该角色的任何角色和特权。
只有具有数据库角色资源的CREATE权限的客户端才可能发出CREATE ROLE请求,除非客户端是SUPERUSER。Cassandra中的角色管理是可插入的并且可以自定义实现可能只支所持列出选项的一个子集。
如果角色名称包含非字母数字字符,则应使用引号。设置内部认证的凭据
使用WITH PASSWORD子句设置内部认证的密码,将密码用单引号括起来。
如果未设置内部身份验证或角色没有LOGIN权限,则不需要WITH PASSWORD子句。
有条件地创建角色(ROLE)
尝试创建现有角色将导致无效的查询条件,除非使用IF NOT EXISTS选项。如果使用该选项并且角色存在,则该语句是无操作:
CREATE ROLE other_role;
CREATE ROLE IF NOT EXISTS other_role;
更改角色(ROLE)
更改角色选项使用ALTER ROLE语句:
alter_role_statement ::= ALTER ROLErole_name
WITHrole_options
例如:
ALTER ROLE bob WITH PASSWORD = 'PASSWORD_B' AND SUPERUSER = false;
执行ALTER ROLE语句的条件:
- 客户端必须具有SUPERUSER状态才能更改另一个角色的SUPERUSER状态
- 客户端无法更改当前持有的任何角色的SUPERUSER状态
- 客户端只能修改在登录时标识的角色的某些属性(例如PASSWORD)
- 要修改角色的属性,必须授予客户端对该角色的ALTER权限
删除角色(ROLE)
删除角色使用DROPROLE
语句:
drop_role_statement ::= DROP ROLE [ IF EXISTS ] role_name
DROP ROLE要求客户端对相关角色具有DROP权限。另外,客户端可能不会删除其在登录时标识的角色。最后,只有具有SUPERUSER状态的客户端可以DROP另一个SUPERUSER角色。
尝试删除不存在的角色会导致无效的查询条件,除非使用IF EXISTS选项。如果使用该选项并且角色不存在,那么语句是无操作。
授予角色(GRANT ROLE)
将角色授予另一个角色使用GRANT ROLE语句:
grant_role_statement ::= GRANTrole_name
TOrole_name
例如:
GRANT report_writer TO alice;
此语句将report_writer角色授予alice。授予report_writer的任何权限也都由alice获取。
角色被建模为有向无环图,因此不允许循环授权。 以下示例导致错误条件:
GRANT role_a TO role_b;
GRANT role_b TO role_a;
GRANT role_a TO role_b;
GRANT role_b TO role_c;
GRANT role_c TO role_a;
吊销角色(REVOKE ROLE)
吊销角色使用REVOKE ROLE语句:
revoke_role_statement ::= REVOKErole_name
FROMrole_name
例如:
REVOKE report_writer FROM alice;
此语句撤销alice的report_writer角色。alice通过report_writer角色获取的任何权限也将被撤销。
角色列表(LIST ROLE)
所有已知角色(在系统中或授予特定角色)可以使用LIST ROLES语句列出:
list_roles_statement ::= LIST ROLES [ OF role_name
] [ NORECURSIVE ]
例如:
LIST ROLES;
返回系统中的所有已知角色,这需要对数据库角色资源具有DESCRIBE权限。和:
LIST ROLES OF alice;
枚举授予alice的所有角色,包括那些过渡性获得的角色。但:
LIST ROLES OF bob NORECURSIVE
列出直接授予bob的所有角色,而不包括任何过渡获取的角色。
角色(Users)
在Cassandra 2.2中引入角色之前,认证和授权基于USER的概念。为了向后兼容,遗留语法已被保留,USER中心语句成为基于ROLE的等同体的同义词。换句话说,创建/更新用户只是用于创建/更新角色的不同语法。
创建角色(USER)
创建用户使用CREATE USER语句:
create_user_statement ::= CREATE USER [ IF NOT EXISTS ]role_name
[ WITH PASSWORDstring
] [user_option
] user_option ::= SUPERUSER | NOSUPERUSER
例如:
CREATE USER alice WITH PASSWORD 'password_a' SUPERUSER;
CREATE USER bob WITH PASSWORD 'password_b' NOSUPERUSER;
CREATE USER相当于CREATE ROLE,其中LOGIN选项为true。因此,下面的语句对是等价的:
CREATE USER alice WITH PASSWORD 'password_a' SUPERUSER;
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true AND SUPERUSER = true;
CREATE USER IF EXISTS alice WITH PASSWORD 'password_a' SUPERUSER;
CREATE ROLE IF EXISTS alice WITH PASSWORD = 'password_a' AND LOGIN = true AND SUPERUSER = true;
CREATE USER alice WITH PASSWORD 'password_a' NOSUPERUSER;
CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true AND SUPERUSER = false;
CREATE USER alice WITH PASSWORD 'password_a' NOSUPERUSER;
CREATE ROLE alice WITH PASSWORD = 'password_a' WITH LOGIN = true;
CREATE USER alice WITH PASSWORD 'password_a';
CREATE ROLE alice WITH PASSWORD = 'password_a' WITH LOGIN = true;
更改角色(USER)
更改用户的选项使用ALTER USER语句:
alter_user_statement ::= ALTER USERrole_name
[ WITH PASSWORDstring
] [user_option
]
例如:
ALTER USER alice WITH PASSWORD 'PASSWORD_A';
ALTER USER bob SUPERUSER;
角色列表(LIST USERS)
可以使用LIST USERS语句列出现有用户:
list_users_statement ::= LIST USERS
请注意,此语句等效于:
LIST ROLES;
但只有具有LOGIN权限的角色才包含在输出中。
数据控制
权限
资源上的权限获取自角色;在Cassandra中有几种不同类型的资源,每种类型都是分层建模的:
- 数据资源,键空间和表的层次结构具有结构ALL KEYSPACES - > KEYSPACE - > TABLE
- 函数资源具有结构ALL FUNCTIONS - > KEYSPACE - > FUNCTION
- 代表角色的资源具有结构ALL ROLES - > ROLE
- 代表映射到MBeans / MXBeans集合的JMX ObjectNames的资源具有结构ALL MBEANS - > MBEAN
可以在这些层次结构的任何级别授予权限,并且它们向下传递。 因此,对链上较高的资源授予权限其下所有资源将自动获取到相同权限。例如,在KEYSPACE上授予SELECT权限则该KEYSPACE中的所有表都将获取SELECT权限。同样,对ALL FUNCTIONS授予权限则无论是哪个键空间下的方法都将获得相同权限。还可以对属于特定键空间的所有函数授予权限。
对权限的修改对现有客户端会话可见;也就是说,在权限改变之后不需要重新建立连接。可用权限的完整集合是:
CREATE
ALTER
DROP
SELECT
MODIFY
AUTHORIZE
DESCRIBE
EXECUTE
并非所有权限都适用于每种类型的资源。 例如,EXECUTE仅在函数或mbeans的上下文中相关;在表示表的资源上授予EXECUTE是无意义的。尝试对不能应用于其的资源授予权限将导致错误响应。下面说明哪些权限可以授予哪些类型的资源,哪些语句由该权限启用。
权限 | 资源 | 操作 |
---|---|---|
CREATE | ALLKEYSPACES | 在任何键空间中创建KEYSPACE 和 CREATE TABLE |
CREATE | KEYSPACE | 在指定的键空间CREATETABLE |
CREATE | ALLFUNCTIONS | 在任何键空间CREATEFUNCTION 和 CREATEAGGREGATE |
CREATE | ALLFUNCTIONSINKEYSPACE | 在指定的键空间CREATEFUNCTION 和CREATEAGGREGATE |
CREATE | ALLROLES | CREATEROLE |
ALTER | ALLKEYSPACES | 在任何键空间ALTERKEYSPACE 和 ALTERTABLE |
ALTER | KEYSPACE |
在指定键空间ALTERKEYSPACE 和 ALTERTABLE |
ALTER | TABLE | ALTER TABLE |
ALTER | ALLFUNCTIONS | CREATEFUNCTION 和 CREATEAGGREGATE : 替换现有的 |
ALTER | ALLFUNCTIONSINKEYSPACE | CREATEFUNCTION 和 CREATEAGGREGATE : 替换指定键空间中现有的 |
ALTER | FUNCTION |
CREATEFUNCTION 和 CREATEAGGREGATE : 替换现有的 |
ALTER | ALLROLES | ALTERROLE对任何角色 |
ALTER | ROLE | ALTERROLE |
DROP | ALLKEYSPACES | 在任何键空间DROPKEYSPACE 和DROPTABLE |
DROP | KEYSPACE | 在指定键空间DROPTABLE |
DROP | TABLE | DROPTABLE |
DROP | ALLFUNCTIONS | 在任何键空间DROPFUNCTION 和DROPAGGREGATE |
DROP | ALLFUNCTIONSINKEYSPACE | 在指定键空间DROPFUNCTION 和DROPAGGREGATE |
DROP | FUNCTION | DROPFUNCTION |
DROP | ALLROLES | DROPROLE 对任何角色 |
DROP | ROLE | DROPROLE |
SELECT | ALLKEYSPACES | 在任何表中SELECT |
SELECT | KEYSPACE | 在指定键空间下的表中SELECT |
SELECT | TABLE | 在指定的表中SELECT |
SELECT | ALLMBEANS | 在任何mbean上调用getter方法 |
SELECT | MBEANS | 在匹配通配符模式的任何mbean上调用getter方法 |
SELECT | MBEAN | 在指定名称的mbean上调用getter方法 |
MODIFY | ALLKEYSPACES | 在任何表中INSERT ,UPDATE ,DELETE 和TRUNCATE |
MODIFY | KEYSPACE | 在指定键空间下的任何表中 |
MODIFY | TABLE | 在指定表中 |
MODIFY | ALLMBEANS | 在任何mbean上调用setter方法 |
MODIFY | MBEANS | 在匹配通配符模式的任何mbean上调用setter方法 |
MODIFY | MBEAN | 在指定名称的mbean上调用setter方法 |
AUTHORIZE | ALLKEYSPACES | 在任何表中GRANTPERMISSION 和REVOKEPERMISSION |
AUTHORIZE | KEYSPACE | 在指定键空间下的任何表中 |
AUTHORIZE | TABLE | 在指定表中 |
AUTHORIZE | ALLFUNCTIONS | 在任何方法中 |
AUTHORIZE | ALLFUNCTIONSINKEYSPACE | 在指定键空间下 |
AUTHORIZE | FUNCTION | 在指定方法中 |
AUTHORIZE | ALLMBEANS | 在任何mbean上 |
AUTHORIZE | MBEANS | 在匹配通配符模式的任何mbean上 |
AUTHORIZE | MBEAN | 在指定名称的mbean上 |
AUTHORIZE | ALLROLES |
|
AUTHORIZE | ROLES |
GRANTPERMISSION 和 REVOKEPERMISSION 对于指定的角色 |
DESCRIBE | ALLROLES | LIST ROLES对所有角色或只有角色授予另一个指定角色 |
DESCRIBE | ALLMBEANS | 从平台的MBeanServer检索有关mbean的元数据 |
DESCRIBE | MBEANS | 从平台MBeanServer检索与通配符模式匹配的mbean的元数据 |
DESCRIBE | MBEAN | 从平台的MBeanServer检索有关指定名称的mbean的元数据 |
EXECUTE | ALLFUNCTIONS | SELECT,INSERT和UPDATE使用任何函数,以及使用CREATE AGGREGATE中的任何函数
|
EXECUTE | ALLFUNCTIONSINKEYSPACE | 使用指定键空间中的任何函数执行SELECT,INSERT和UPDATE,并在CREATE AGGREGATE中使用键空间中的任何函数
|
EXECUTE | FUNCTION | SELECT,INSERT和UPDATE,使用指定的函数并使用CREATE AGGREGATE中的函数
|
EXECUTE | ALLMBEANS | 对任何mbean执行操作 |
EXECUTE | MBEANS | 对匹配通配符模式的任何mbean执行操作 |
EXECUTE | MBEAN | 对指定名称的mbean执行操作 |
授予权限
授予权限使用GRANT PERMISSION语句:
grant_permission_statement ::= GRANTpermissions
ONresource
TOrole_name
permissions ::= ALL [ PERMISSIONS ] |permission
[ PERMISSION ] permission ::= CREATE | ALTER | DROP | SELECT | MODIFY | AUTHORIZE | DESCRIBE | EXECUTE resource ::= ALL KEYSPACES | KEYSPACEkeyspace_name
| [ TABLE ]table_name
| ALL ROLES | ROLErole_name
| ALL FUNCTIONS [ IN KEYSPACEkeyspace_name
] | FUNCTIONfunction_name
'(' [cql_type
( ','cql_type
)* ] ')' | ALL MBEANS | ( MBEAN | MBEANS )string
例如:
GRANT SELECT ON ALL KEYSPACES TO data_reader;
这为任何具有角色data_reader的用户授予在所有键空间上的任何表上执行SELECT语句的权限:
GRANT MODIFY ON KEYSPACE keyspace1 TO data_writer;
这为任何具有角色data_writer的用户授予对keyspace1键空间中所有表执行UPDATE,INSERT,DELETE和TRUNCATE查询的权限:
GRANT DROP ON keyspace1.table1 TO schema_owner;
这给任何具有schema_owner角色的用户授予DROP keyspace1.table1的权限:
GRANT EXECUTE ON FUNCTION keyspace1.user_function( int ) TO report_writer;
这将授予任何具有report_writer角色权限的用户执行使用函数keyspace1.user_function(int)的SELECT,INSERT和UPDATE查询:
GRANT DESCRIBE ON ALL ROLES TO role_admin;
这将授予任何具有role_admin角色权限的用户使用LIST ROLES语句查看系统中的所有角色
GRANT ALL
当使用GRANT ALL表单时,将根据目标资源自动确定适当的权限集。
自动授权(Automatic Granting)
当创建资源时,通过CREATE KEYSPACE,CREATE TABLE,CREATE FUNCTION,CREATE AGGREGATE或CREATE ROLE语句创建资源,创建者(标识为语句的数据库用户的角色)将自动授予对新资源的所有适用权限。
吊销权限(REVOKE PERMISSION)
吊销角色权限使用REVOKE PERMISSION语句:
revoke_permission_statement ::= REVOKEpermissions
ONresource
FROMrole_name
例如:
REVOKE SELECT ON ALL KEYSPACES FROM data_reader;
REVOKE MODIFY ON KEYSPACE keyspace1 FROM data_writer;
REVOKE DROP ON keyspace1.table1 FROM schema_owner;
REVOKE EXECUTE ON FUNCTION keyspace1.user_function( int ) FROM report_writer;
REVOKE DESCRIBE ON ALL ROLES FROM role_admin;
权限列表(LIST PERMISSIONS)
列出授予的权限使用LIST PERMISSIONS语句:
list_permissions_statement ::= LISTpermissions
[ ONresource
] [ OFrole_name
[ NORECURSIVE ] ]
例如:
LIST ALL PERMISSIONS OF alice;
显示授予alice的所有权限,包括从任何其他角色过渡获取的权限:
LIST ALL PERMISSIONS ON keyspace1.table1 OF bob;
显示授予bob的keyspace1.table1的所有权限,包括从任何其他角色获取的权限。这还包括可以应用于keyspace1.table1的资源层次结构中的任何权限。例如,bob应该对keyspace1具有ALTER权限,这将包含在此查询的结果中。添加NORECURSIVE开关将结果限制为仅直接授予bob或bob的角色的那些权限:
LIST SELECT PERMISSIONS OF carlos;
显示授予carlos或任何carlos角色的任何权限,仅限于任何资源上的SELECT权限。