- managerUser (可多值,至少一个)
- shardingUser (可多值)
- rwSplitUser (可多值)
- blacklist(可多值)
配置注意事项:
- 当user.xml文件中不配置shardingUser,dble不再加载sharding.xml配置文件(即dble不具备分表分库),包括集群情况下出现sharding.xml不一致,均属于已知现象。
配置名称 |
配置内容 |
可选项/默认值 |
详细作用原理或应用 |
name |
用户名 |
符合mysql用户名规范的字符串 |
用户唯一标识,用于登录校验 |
password |
密码 |
用户密码校验 |
|
usingDecrypt |
是否启用加密 |
可配置true/false,默认false |
启用加密password项配置通过执行脚本encrypt.sh 0:{user}:{password}的结果进行配置 |
whiteIPs |
可登录的ip的白名单 |
可选项 |
可以参考本配置文件中的whiteIPs内容 |
readOnly |
是否是只读管理用户 |
可配置true/false,默认false |
只读用户不能进行运维管理操作,只能进行show或者select |
maxCon |
负载限制,默认不做限制 |
正整数 |
用户的连接数限制,会在用户验证登录的时候进行校验,默认0,表示不做限制。 特别的,管理用户不受系统级别的maxCon的限制 |
配置名称 |
配置内容 |
可选项/默认值 |
详细作用原理或应用 |
name |
用户名 |
符合mysql用户名规范的字符串 |
用户唯一标识,用于登录校验 |
password |
密码 |
用户密码校验 |
|
usingDecrypt |
是否启用加密 |
可配置true/false,默认false |
启用加密password项配置通过执行脚本encrypt.sh 0:{user}:{password}的结果进行配置 |
whiteIPs |
可登录的ip的白名单 |
可选项 |
可以参考本配置文件中的whiteIPs内容 |
readOnly |
是否是只读分库用户 |
可配置true/false,默认false |
只读用户不能进行DML操作,只能进行show或者select |
tenant |
租户名 |
可选配置。和用户名相当于整个用户列表的联合主键 |
可以参考本配置文件中的tenant内容 |
schemas |
该用户可以访问的schema列表 |
可配置多值,用逗号隔开 |
该用户可以访问的schema列表,schema参见sharding.xml中的schma名称 |
maxCon |
负载限制,默认不做限制 |
正整数 |
用户的连接数限制,会在用户验证登录的时候进行校验,默认0,表示不做限制。 特别的,当系统级别的maxCon已经到达上限之后,本用户的maxCon会失效,不能新建连接 |
blacklist |
blacklist的名称 |
可选配置 |
可以参考本配置文件中的blacklist内容 |
privileges |
子元素,具体table的增删改查权限 |
可选配置 |
可以参考本配置文件中的privileges内容 |
user.privileges 下的schema的dml权限,可配置多值
配置名称 |
配置内容 |
可选项/默认值 |
详细作用原理或应用 |
name |
schema名称 |
用以标识对应schema |
|
dml |
dml权限 |
0000 |
权限判断,每一位分别表示INSERT UPDATE SELECT DELETE四种权限 1- 拥有权限 0-没有权限 例如拥有所有权限为1111 |
table |
子元素 |
可配置多个 |
如果没有配置,则table继承schema的权限 |
配置名称 |
配置内容 |
可选项/默认值 |
详细作用原理或应用 |
name |
表格名称 |
在权限判断的时候作为key值 |
|
dml |
dml权限 |
0000 |
权限判断,每一位分别表示INSERT UPDATE SELECT DELETE四种权限 1- 拥有权限 0-没有权限 例如拥有所有权限为1111 |
配置名称 |
配置内容 |
可选项/默认值 |
详细作用原理或应用 |
name |
用户名 |
符合mysql用户名规范的字符串 |
用户唯一标识,用于登录校验 |
password |
密码 |
用户密码校验 |
|
usingDecrypt |
是否启用加密 |
可配置true/false,默认false |
启用加密password项配置通过执行脚本encrypt.sh 0:{user}:{password}的结果进行配置 |
whiteIPs |
可登录的ip的白名单 |
可选项 |
可以参考本配置文件中的whiteIPs内容 |
tenant |
租户名 |
可选配置。和用户名相当于整个用户列表的联合主键 |
可以参考本配置文件中的tenant内容 |
dbGroup |
该用户对应的数据库组dbGroup |
单值配置 |
对应db.xml中的dbGroup名称 |
maxCon |
负载限制,默认不做限制 |
正整数 |
用户的连接数限制,会在用户验证登录的时候进行校验,默认0,表示不做限制。 特别的,当系统级别的maxCon已经到达上限之后,本用户的maxCon会失效,不能新建连接 |
blacklist |
blacklist的名称 |
可选配置 |
可以参考本配置文件中的blacklist内容 |
配置名称 | 配置内容 | 配置范围/可选项 | 详细作用原理或应用 |
---|---|---|---|
name | blacklist的名称 | 用于被用户引用,标记黑名单 |
|
property | 子元素,可以有多个 | 详细的黑名单校验规则 | 如果开启黑名单校验具体的校验规则将有 所有property来确定 |
形式为
<property name="selectHavingAlwayTrueCheck">true</property>
下面表格来描述key和value的含义。
配置名称
|
配置内容
|
默认值
|
可选项
|
详细作用原理或应用
|
备注
|
---|---|---|---|---|---|
selectAllow |
是否允许select语句 | true | true - 允许 false - 禁止 |
在执行query之前会纯粹根据SQL进行语句的校验,发现sql是select语句会抛出异常返回错误信息 |
可用 |
selectAllColumnAllow |
是否允许查询所有列 | true | true - 允许 false - 禁止 |
会根据查询sql进行判断,如果发现sql是直接查询*会有这个异常;但是如果带有别名(x.*),则不在此列 |
存在问题 |
selectIntoAllow |
是否允许select into 语句 | true | true - 允许 false - 禁止 |
在执行query之前会纯粹根据SQL进行语句的校验,发现sql是select into语句会抛出异常返回错误信息 |
Dble本身不支持 |
deleteAllow |
是否允许delete语句 | true | true - 允许 false - 禁止 |
在执行delete之前会纯粹根据SQL进行语句的校验,发现sql是delete语句会抛出异常返回错误信息 |
可用 |
updateAllow |
是否允许update语句 | true | true - 允许 false - 禁止 |
在执行update之前会纯粹根据SQL进行语句的校验,发现sql是update语句会抛出异常返回错误信息 |
可用 |
insertAllow |
是否允许insert | true | true - 允许 false - 禁止 |
在执行insert之前会纯粹根据SQL进行语句的校验,发现sql是insert语句会抛出异常返回错误信息 |
可用 |
replaceAllow |
是否允许replace语句 | true | true - 允许 false - 禁止 |
在执行replace之前会纯粹根据SQL进行语句的校验,发现sql是replace语句会抛出异常返回错误信息 |
可用 |
mergeAllow |
是否允许merge语句 (在mysql中不支持) |
true | true - 允许 false - 禁止 |
会校验是否是merge语句 | 在Dble中没有效果 |
callAllow |
是否允许call语句 | true | true - 允许 false - 禁止 |
在执行query之前会纯粹根据SQL进行语句的校验,发现sql是call语句会抛出异常返回错误信息 |
可用 |
setAllow |
是否允许set语句 | true | true - 允许 false - 禁止 |
在执行set之前会纯粹根据SQL进行语句的校验,发现sql是set语句会抛出异常返回错误信息 |
可用 |
truncateAllow |
是否允许truncate语句 | true | true - 允许 false - 禁止 |
在执行truncate之前会纯粹根据SQL进行语句的校验,truncate语句会抛出异常返回错误信息 |
可用 |
createTableAllow |
是否允许create table 语句 | ture | true - 允许 false - 禁止 |
在执行create table之前会纯粹根据SQL进行语句的校验,发现sql是create table语句会抛出异常返回错误信息 |
可用 |
alterTableAllow |
是否允许alter table 语句 | true | true - 允许 false - 禁止 |
在执行alter table之前会纯粹根据SQL进行语句的校验,发现sql是alter table语句会抛出异常返回错误信息 |
可用 |
dropTableAllow |
是否允许drop table 语句 | ture | true - 允许 false - 禁止 |
在执行drop table之前会纯粹根据SQL进行语句的校验,发现sql是drop table语句会抛出异常返回错误信息 |
可用 |
commentAllow |
是否允许在SQL中存在注释 | false | true - 允许 false - 禁止 |
在执行SQL之前会纯粹根据SQL进行语句的校验,发现注释语句会抛出异常返回错误信息 |
可用 |
noneBaseStatementAllow |
是否允许非以上基本语句的其他语句,缺省关闭,通过这个选项就能够屏蔽DDL。 | false | true - 允许 false - 禁止 |
在执行SQL之前会纯粹根据SQL进行语句的校验,发现sql是非以上基本语句的其他语句会抛出异常返回错误信息 |
可用 |
multiStatementAllow |
是否允许一次提交多条sql | false | true - 允许 false - 禁止 |
会检查sql的数量,如果超过一则抛出异常 | 由于实现的原因,这个黑名单的配置在Dble下不生效,无法实现多语句的开关,开关由协议层控制,需要驱动自行设置 |
useAllow |
是否允许use语句 | true | true - 允许 false - 禁止 |
在执行use之前会纯粹根据SQL进行语句的校验,发现sql是use语句会抛出异常返回错误信息 |
暂不具有实际意义 |
describeAllow |
是否允许describe语句 | true | true - 允许 false - 禁止 |
在执行SQL之前会纯粹根据SQL进行语句的校验,describe语句会抛出异常返回错误信息 |
可用 |
showAllow |
是否允许show语句 | true | true - 允许 false - 禁止 |
在执行SQL之前会纯粹根据SQL进行语句的校验,show语句会抛出异常返回错误信息 |
可用 |
commitAllow |
是否允许commit语句 | true | true - 允许 false - 禁止 |
在执行commit之前会纯粹根据SQL进行语句的校验,commit语句会抛出异常返回错误信息 |
可用 |
rollbackAllow |
是否允许rollback | true | true - 允许 false - 禁止 |
在执行rollback之前会纯粹根据SQL进行语句的校验,rollback语句会抛出异常返回错误信息 |
可用 Dble慎用 |
selectWhereAlwayTrueCheck |
是否允许复杂select where 条件结果恒为真 |
true | true - 允许 false - 禁止 |
1、where部分的结果为真 2、SQL语句需要以注释结尾(不能有换行之类的) 3、条件部分不是简单SQL(单个条件、含有简单数值对等或大小比较、直接是真假值的表达式等) 符合以上三个条件的查询在校验的时候会被阻止, 举例:select * from test where id = id and hujh = hujh/*lxxddfsgdfsfdqwesfct*/; |
暂不具有实际意义 |
selectHavingAlwayTrueCheck |
是否允许复杂select having 条件结果恒为真 |
true | true - 允许 false - 禁止 |
1、having部分的结果为真 2、SQL语句需要以注释结尾(不能有换行之类的) 3、条件部分不是简单SQL(单个条件、含有简单数值对等或大小比较、直接是真假值的表达式等) 符合以上三个条件的查询在校验的时候会被阻止, 举例:select * from test having id = id and hujh = hujh /*lxxddfsgdfsfdqwesfct*/; |
暂不具有实际意义 |
deleteWhereAlwayTrueCheck |
是否允许delete语句存在恒真条件 | true | true - 启用 false -不启用 |
如果解析发现delete语句存在恒真条件,并且满足sql以注释结尾,并且where条件不是简单条件的,会抛出异常举例:delete from suntest where id = id and name= name /*sdfaasdf*/; |
暂不具有实际意义 |
deleteWhereNoneCheck |
是否允许delete语句没有where条件 | false | true - 启用 false -不启用 |
如果发现delete语句没有限定条件会抛出异常举例:delete from suntest; |
可用 |
updateWhereAlayTrueCheck |
是否允许delete语句存在恒真条件 | true | true - 启用 false -不启用 |
如果解析发现delete语句存在恒真条件,并且满足sql以注释结尾,并且where条件不是简单条件的,会抛出异常举例:update suntest set name = '33' where id = id,name = name /*sdfsdf*/; |
暂不具有实际意义 |
updateWhereNoneCheck |
是否允许update语句没有where条件 | false | true - 启用 false -不启用 |
如果发现update语句没有限定条件会抛出异常举例:update suntest set name = '33'; |
可用 |
conditionAndAlwayTrueAllow |
是否允许and连接的语句存在 恒为true的条件 |
false | true - 允许 false - 禁止 |
会根据where之后and跟随的条件进行判断,如果发现恒为真的情况会抛出异常举例:select * from suntest where id = 567 and 1 = 1; |
可用 |
conditionAndAlwayFalseAllow |
是否允许and连接的语句存在 恒为false的条件 |
false | true - 允许 false - 禁止 |
会根据where之后and跟随的条件进行判断,如果发现恒为假的情况会抛出异常举例:select * from suntest where id = 567 and 1 != 1; |
可用 |
conditionLikeTrueAllow |
是否允许like之后包含永真条件 | true |
true - 允许 false - 禁止 |
会根据SQL里面的内容进行判断,发现sql是有like '%'就会抛出异常 | 实际dble计算条件时候并不会对条件一一展开,所以不支持 |
selectIntoOutfileAllow |
是否允许SELECT ... INTO OUTFILE | false | true - 允许 false - 禁止 |
在执行query之前会纯粹根据SQL进行语句的校验,发现sql是SELECT ... INTO OUTFILE句会抛出异常返回错误信息 |
Dble本身不支持 |
selectUnionCheck |
是否进行union check | true | true - 进行 false -不进行 |
如果进行校验,则不允许unoin语句 举例:select * from sbtest1 unoin select * from suntest; |
druid 实现有bug,无法正常使用 |
selectMinusCheck |
是否进行MINUS check | true | true - 进行 false -不进行 |
如果进行校验,则不允许MINUS语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where namec = 'fff' minus select * from dual; |
mysql无此语法,不具有实际意义 |
selectExceptCheck |
是否进行except check | true | true - 进行 false -不进行 |
如果进行校验,则不允许except语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where name = 'ff' except select * from dual; |
mysql无此语法,不具有实际意义 |
selectIntersectCheck |
是否进行intersect check | true | true - 进行 false -不进行 |
如果进行校验,则不允许INTERSECT语句, 当且仅当left sql的from不是空并且right from为空的时候不能通过校验 举例:select * from sbtest1 where name = 'ff' INTERSECT select * from dual; |
mysql无此语法,不具有实际意义 |
mustParameterized |
是否必须参数化 | false | true - 是 false -否 |
在执行SQL之前会纯粹根据SQL进行语句的校验,类似 name = 'sdfasdf' ,id = 1语句会抛出异常返回错误信息 |
可用 |
strictSyntaxCheck |
是否启用严格语法检查 | true | true - 是 false - 否 |
是否进行严格的语法检测,Druid SQL Parser在某些场景不能覆盖所有的SQL语法,属于调试级别的参数,在正常的使用中不建议更改 |
暂不具有实际意义 |
conditionOpXorAllow |
是否允许SQL中使用关系符XOR | false | true - 允许 false - 禁止 |
在执行SQL之前会纯粹根据SQL进行语句的校验,类似运算符语句会抛出异常返回错误信息 |
可用 |
conditionOpBitwseAllow |
查询条件中是否允许有"&"、 "~"、"|"、"^"运算符。 |
true | true - 允许 false - 禁止 |
在执行SQL之前会纯粹根据SQL进行语句的校验,类似运算符语句会抛出异常返回错误信息 |
可用 |
conditionDoubleConstAllow |
是否允许连续两个常量判断 | false | true - 允许 false - 禁止 |
会根据SQL里面的内容进行判断,如果发现有两个常量判断抛出异常select * from suntest asdf where 1 = 1 and 2 = 1; |
可用 |
minusAllow |
是否支持minus语句 | true | true - 允许 false - 禁止 |
在执行minus之前会纯粹根据SQL进行语句的校验,minus语句会抛出异常返回错误信息 |
可用 |
intersectAllow |
是否支持intersect | true | true - 允许 false - 禁止 |
在执行intersect之前会纯粹根据SQL进行语句的校验,intersect语句会抛出异常返回错误信息 |
可用 |
constArithmeticAllow |
是否允许常量运算 | true | true - 允许 false - 禁止 |
在SQL中如果发现包含有常量运算会抛出异常select * from suntest asdf where id = 2 -1; |
可用 |
limitZeroAllow |
是否允许出现limit 0的情况 | false | true - 允许 false - 禁止 |
在执行SQL之前会纯粹根据SQL进行语句的校验,limit 0语句会抛出异常返回错误信息 |
可用 |
selectLimit |
设置limit行数 | -1 | -1 不设置 |
配置最大返回行数,如果select语句没有指定最大返回行数,会自动修改selct添加返回限制 |
Dble中不可用 |
startTransactionAllow |
是否允许START TRANSACTION | true | true - 允许 false -禁止 |
在执行START TRANSACTION之前会纯粹根据SQL进行语句的校验,发现START TRANSACTION语句会抛出异常返回错误信息 |
可用 |
lockTableAllow |
是否允许lock tables语句 | true | true - 允许 false - 禁止 |
在执行lock tables之前会纯粹根据SQL进行语句的校验,发现lock语句会抛出异常返回错误信息 |
可用 |
hintAllow |
是否允许sql 包含hint | true | true - 允许 false - 禁止 |
在执行sql之前会纯粹根据SQL进行语句的校验,发现SQL是包含hint语句会抛出异常返回错误信息 |
可用 |
blockAllow |
是否允许语句块 | true | true - 允许 false - 禁止 |
在解析SQL阶段会判断SQL是否属于SQL语句块,如果是的话就会抛出错误 举例:BEGIN; select * from suntest;END;// |
可用 |
renameTableAllow |
是否允许rename table 语句 | true | true - 允许 false - 禁止 |
在执行rename table之前会纯粹根据SQL进行语句的校验,发现sql是rename table语句会抛出异常返回错误信息 |
ble本身不支持 |
completeInsertValuesCheck |
在dble依赖的1.0.31、1.2.6版本中没有效果 | false | true - 允许 false - 禁止 |
druid内部函数调用flag,在dble中没有作用 | 暂不具有实际意义 |
caseConditionConstAllow |
是否允许复杂查询中外部是一个常量 | false | true - 允许 false - 禁止 |
是否允许复杂查询中外部是一个常量, 如果子查询外部对应的是常量那么就在SQL检查的时候抛出异常 举例:delete from suntest where id = 123 and 'name' = (selectcase 'fname' when dsome' else 'good' end from xtest ) /*sdfaasdf*/; |
暂不具有实际意义 |
doPrivilegedAllow |
druid内部权限控制使用 | false | true - 允许 false - 禁止 |
druid内部函数调用flag,在dble中没有作用 | 暂不具有实际意义 |
tableCheck |
检测是否使用了禁用的table | true | true - 启用 false - 禁止 |
这个需要配合drui的配置模式使用,在dble此功能无法被使用 | 暂不具有实际意义 |
schemaCheck |
检测是否使用了禁用的schema | true | true - 启用 false - 禁止 |
这个需要配合drui的配置模式使用,在dble此功能无法被使用 | 暂不具有实际意义 |
functionCheck |
检测是否使用了禁用的function | true | true - 启用 false - 禁止 |
这个需要配合drui的配置模式使用,在dble此功能无法被使用 | 暂不具有实际意义 |
objectCheck |
检测是否使用了禁用的object | true | true - 启用 false - 禁止 |
这个需要配合drui的配置模式使用,在dble此功能无法被使用 | 暂不具有实际意义 |
variantCheck |
检测是否使用了禁用的变量 | true | true - 启用 false - 禁止 |
这个需要配合druid的配置模式使用,在dble此功能无法被使用 | 暂不具有实际意义 |
readOnlyTables |
检测表是否只读 | - | 需要指定表 | 指定的表只读后,在SELECT INTO、DELETE、UPDATE、INSERT、MERGE语句中出现会抛出异常返回错误信息 | 暂不具有实际意义 |
metadataAllow |
是否允许调用getmetadata方法 | true | true - 允许 false - 禁止 |
druid内部函数调用flag,在dble中没有作用 | 暂不具有实际意义 |
wrapAllow |
是否允许调用 isWrapFor和unwrap方法 |
true | true - 允许 false - 禁止 |
druid内部函数调用flag,在dble中没有作用 | 暂不具有实际意义 |
dble支持两种方式的设置
-
用户:租户 这种方式以:分隔开用户和租户,一起作为登录的用户 如:
mysql -u用户:租户 -p -h
DriverManager.getConnection("jdbc:mysql://127.0.0.1:8066", "root2:tenant1", "123456");
-
JDBC-connectionAttributes 在
connectionAttributes
中添加tenant指定租户名称 如:DriverManager.getConnection("jdbc:mysql://127.0.0.1:8066?connectionAttributes=tenant:tenant1", "root2", "123456");
以上两种方式中,若同时设置了1/2两种方式,则采用方式1的配置
默认不限制,值为IP,多个用逗号隔开
格式:
支持用户输入多ip,如192.168.1.2,192.168.2.22
支持用户输入IP段,如192.168.1.10-192.168.1.100
支持用户输入通配符,如192.168.1.%
支持用户输入IP/CIDR格式,如192.168.1.1/20
以上格式同样适合IPV4/IPV6
注:
- 管理员用户一旦配置该项,默认允许本机(127.0.0.1、0:0:0:0:0:0:0:1)登陆
- IPV6格式中不支持IPv4映射
<?xml version="1.0" encoding="UTF-8"?>
<dble:user xmlns:dble="http://dble.cloud/">
<managerUser name="man1" password="654321" whiteIPs="127.0.0.1,0:0:0:0:0:0:0:1" readOnly="false"/>
<managerUser name="user" usingDecrypt="true" readOnly="true" password="AqEkFEuIFAX6g2TJQnp4cJ2r7Yc0Z4/KBsZqKhT8qSz18Aj91e8lxO49BKQElC6OFfW4c38pCYa8QGFTub7pnw==" />
<shardingUser name="root" password="123456" schemas="testdb" readOnly="false" blacklist="blacklist1" maxCon="20"/>
<shardingUser name="root2" password="123456" schemas="testdb,testdb2" maxCon="20" tenant="tenant1">
<privileges check="true">
<schema name="testdb" dml="0110">
<table name="tb01" dml="0000"/>
<table name="tb02" dml="1111"/>
</schema>
</privileges>
</shardingUser>
<!--rwSplitUser not work for now-->
<rwSplitUser name="rwsu1" password="123456" dbGroup="dbGroup1" blacklist="blacklist1"
maxCon="20"/>
<blacklist name="blacklist1">
<property name="selectAllow">true</property>
</blacklist>
</dble:user>