DolphinDB database 提供了强大、灵活、安全的权限控制系统。控制节点(controller)做为权限管理中心,使用RSA加密方式对用户关键信息进行加密。web
主要功能:数据库
1.1 用户和组跨域
用户和组是承载权限的实体。一个用户能够属于多个组,一个组也能够包括多个用户。浏览器
引入组的概念,能够方便的对具备相同权限的用户进行权限配置和管理,用户最终的实际权限是用户自己的权限,加上所属组的权限的结果。安全
1.2 系统管理员服务器
DolphinDB集群第一次启动时,会自动建立用户名为"admin",密码为"123456"的系统管理员。此管理员拥有全部的权限,例如建立或删除数据库,可读写全部表,在数据库中建立或删除数据表,可以使用全部的函数视图,可执行或测试脚本。此管理员能够建立或删除其余管理员。其余管理员刚被建立后,可建立或删除其余管理员,用户,或组,但除此以外没有任何权限。管理员可自我受权,亦可互相受权。请注意管理员"admin"没法被删除。app
管理员可以使用函数或命令createUser, deleteUser, createGroup, ddeleteGroup, addGroupMember, dlelteGroupMember, getUserAccess, getUserList, getGroupList, resetPwd 对用户和组进行方便的操做。分布式
1.3 权限类别ide
DolphinDB提供如下8种权限类别:函数
其中前面5种须要提供操做对象,后面3种不须要提供操做对象。
请注意,权限配置中涉及到的数据库及数据表均为在分布式文件系统(DFS)中创建的。
1.4 权限设置
只有管理员才可设置权限,且只能在控制节点上执行权限类操做。刚建立的用户或组没有被赋予或被禁止任何权限。管理员可以使用grant/deny/revoke 命令来设置用户或者组的权限。在1.3种的8种权限,可做为这三个命令的accessType参数值。
如下经过两个例子,说明权限设置的操做。
管理员登陆:
login(`admin, `123456)
建立用户 NickFoles:
createUser("NickFoles","AB123!@")
赋予用户 NickFoles 可读任何DFS数据表的权限:
grant("NickFoles",TABLE_READ,"*")
禁止用户 NickFoles 建立或删除数据库:
deny("NickFoles",DB_MANAGE)
建立 SBMVP 组,而且把用户 NickFoles 加入到该组:
createGroup("SBMVP", "NickFoles")
赋予 SBMVP 组可在数据库"dfs://db1"和"dfs://db2"中建立数据表的权限:
grant("SBMVP",DBOBJ_CREATE,["dfs://db1","dfs://db2"])
最后用户 NickFoles 的权限为:能够访问全部的数据表,不能建立或删除数据库,能够对dfs://db1和dfs://db2进行建立数据表的操做。
经过组能够方便的设置用户权限:
createUser("EliManning", "AB123!@") createUser("JoeFlacco","CD234@#") createUser("DeionSanders","EF345#$") createGroup("football", ["EliManning","JoeFlacco","DeionSanders"]) grant("football", TABLE_READ, "dfs://TAQ/quotes") grant("DeionSanders", DB_MANAGE)
该例子建立了3个用户和1个组,而且这三个用户属于该组。赋予此组可读数据表dfs://TAQ?quotes的权限,同时只赋予用户DeionSanders建立和删除数据库的权限。
可使用grant或deny对全部对象(以*表明)赋予或禁止权限。例如,赋予用户 JoeFlacco 可读任何DFS数据表的权限:
grant("JoeFlacco",TABLE_READ,"*")
当使用grant或deny全部对象后,只能够对全部对象使用revoke,若对某个单一对象使用revoke无效:
revoke("JoeFlacco",TABLE_READ,"dfs://db1/t1")
以上命令无效。
revoke("JoeFlacco",TABLE_READ,"*")
以上命令取消了用户 JoeFlacco 可读任何DFS数据表的权限。
与之相似,使用grant或deny对组赋予或禁止权限后,只能对改组使用revoke来取消该权限设置。若对某个组员使用revoke来取消该权限设置则无效。
1.5 权限肯定规则
用户的最终权限由用户自己的权限与其所属的全部组的权限共同决定。不一样的组有可能对某用户某权限的规定有冲突。如下为权限肯定规则:
createUser("user1","123456") createUser("user2","123456") createGroup("group1") createGroup("group2") addGroupMember(["user1","user2"],"group1") addGroupMember(["user1","user2"],"group2") grant("user1",TABLE_READ,"*") deny("group1",TABLE_READ,"dfs://db1/t1") deny("group2",TABLE_READ,"dfs://db1/t2")
以上三行的结果为,用户user1能够读取除"dfs://db1/t1"和"dfs://db1/t2"之外的全部数据表。
grant("user2",TABLE_WRITE,"*") deny("group1",TABLE_WRITE,"*") grant("group2",TABLE_WRITE,"dfs://db1/t2")
以上三行的结果为,用户user1和user2不能写数据到任何数据表。
1.6 基于函数视图(function view)的权限控制
函数视图提供了一种灵活的方式来控制用户访问数据表,在不给予用户能够阅读数据表全部原始数据的权限的状况下,让用户能够获取由函数视图产生的信息。只有系统管理员有建立和删除函数视图的权限。
管理员定义一个函数视图:
def countTradeAll(){ return exec count(*) from loadTable("dfs://TAQ","Trades") } addFunctionView(countTradeAll) grant("NickFoles",VIEW_EXEC,"countTradeAll")
以用户名NickFoles登陆,执行视图countTradeAll
countTradeAll()
虽然用户NickFoles没有访问表"dfs://TAQ/Trades"的权限,可是能够运行函数视图在此例中来获取表的行数。
函数视图也能够带参数。用户在使用的时候能够输入参数获取相应的结果。下面的例子,咱们建立一个函数视图,获取某一个股票在某一天的全部交易记录。
def getTrades(s, d){ return select * from loadTable("dfs://TAQ","Trades") where sym=s, date=d } addFunctionView(getTrades) grant("NickFoles",VIEW_EXEC,"getTrades")
以用户名NickFoles登陆,并在执行视图getTrades指定股票代码和日期:
getTrades("IBM", 2018.07.09)
程序调度和流计算在后台运行,不少状况下,没有显式登陆,所以权限验证跟用户显式登陆的状况有些不一样。这两类后台任务都是以建立该任务的用户身份来运行。
程序调度是指用户指定在特定的时间,以特定的频率执行一系列任务,多用于适合批处理类业务场景。
login("NickFoles","AB123!@") def readTable(){ read_t1=loadTable("dfs://db1","t1") return exec count(*) from read_t1 } scheduleJob("readTableJob","read DFS table",readTable,minute(now()),date(now()),date(now())+1,'D');
无论NickFoles有没有读"dfs://db1/t1"的权限,readTable任务都能设置成功。
在readTable任务实际运行时,若是用户NickFoles有读"dfs://db1/t1"的权限,则成功执行,不然鉴权失败。
另外,使用dedleteScheduleJob命令的的时候,系统管理员能够删除其余用户制定的任务,非管理员用户只能删除本身建立的任务。
当用户使用subscribeTable函数从一个流数据表中订阅实时数据存入数据表时,应当确认其有写入此数据表的权限。
login("NickFoles","AB123!@") def saveTradesToDFS(mutable dfsTrades, msg): dfsTrades.append!(select today() as date, * from msg) subscribeTable("NODE1", "trades_stream", "trades", 0, saveTradesToDFS{trades}, true, 1000, 1)
在上例中,流数据处理任务把接收到的数据保存到数据表dfsTrades中。在此流数据处理任务执行的时候,系统会动态地鉴定NickFoles是否有写入数据表dfsTrades的权限,若是没有则鉴权失败。
DolphinDB支持使用HTTPS安全协议与web进行通讯。
两种配置HTTPS的方法:
DolphinDB使用服务端证书验证的安全策略。默认状况下,会生成自制证书,客户须要安装服务端的证书,不然浏览器提示不安全链接。每台物理server须要一份证书,所以控制节点和代理节点须要生成证书,数据节点使用同一个物理服务器上代理节点生成的证书。用户也可购买通过第三方认证的证书。
将第三方证书重命名为 server.crt,而且拷贝到控制节点和代理节点的home目录下的keys文件夹中,若keys文件夹不存在,则需手动建立。因为第三方证书通过公认的权威受权机构颁布,因此浏览器默认信任该证书,不须要再手动安装。绝大部分应用场景适合使用此方式。
在小型封闭集群内部通讯时,用户也可使用自制证书进行OPENSSL安全通讯,不过安装自制证书稍微繁琐,具体过程以下:
./dolphindb -enableHTTPS true -home master -publicName www.ABCD.com -mode controller -localSite 192.168.1.30:8500:rh8500 -logFile ./log/master.log
2. 查看证书是否正确生成
启动控制节点, 在home目录下的keys文件夹中,查看是否有自制证书文件server.crt和私钥文件serverPrivate.key。
3. 安装自制证书到浏览器的授信证书中心 不一样的浏览器安装选项稍有不一样,以Google Chrome为例,选择Settings->Advanced->Manage certificates->AUTHORITIES->Import,导入上面生成的server.crt文件。
在浏览器中输入https://www.XXXX.com:8500/以访问集群管理器。若浏览器地址栏显示绿色的小锁,说明证书安装成功,能够进行HTTPS访问。
在集群管理界面中,能够点击任意数据节点,连接到该节点的notebook上。从控制节点跳转到数据节点,有多是访问了不一样的物理服务器(跨域访问)。DolphinDB提供了SSO使得用户无须在集群操做中访问不一样的物理服务器时从新登录系统。
DolphinDB提供两个用于SSO的API函数:
DolphinDB的开发者能够方便安全的使用这些接口来对系统进行扩展。