Skip to content

Latest commit

 

History

History
960 lines (910 loc) · 37.7 KB

1.03_user.xml.md

File metadata and controls

960 lines (910 loc) · 37.7 KB

1.3 user.xml 配置

1.3.1 整体XML结构

  • managerUser (可多值,至少一个)
  • shardingUser (可多值)
  • rwSplitUser (可多值)
  • blacklist(可多值)

配置注意事项:

  1. 当user.xml文件中不配置shardingUser,dble不再加载sharding.xml配置文件(即dble不具备分表分库),包括集群情况下出现sharding.xml不一致,均属于已知现象。

1.3.2 managerUser(管理用户配置)

配置名称

配置内容

可选项/默认值

详细作用原理或应用

name

用户名

符合mysql用户名规范的字符串

用户唯一标识,用于登录校验

password

密码

用户密码校验

usingDecrypt

是否启用加密

可配置true/false,默认false

启用加密password项配置通过执行脚本encrypt.sh 0:{user}:{password}的结果进行配置
举例:
encrypt.sh 0:xxx:123456
fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ==
配置项:
password fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ==
user xxx
登录项:
-u xxx -p123456

whiteIPs

可登录的ip的白名单

可选项

可以参考本配置文件中的whiteIPs内容

readOnly

是否是只读管理用户

可配置true/false,默认false

只读用户不能进行运维管理操作,只能进行show或者select

maxCon

负载限制,默认不做限制

正整数

用户的连接数限制,会在用户验证登录的时候进行校验,默认0,表示不做限制。 特别的,管理用户不受系统级别的maxCon的限制

1.3.3 shardingUser(分库用户配置)

配置名称

配置内容

可选项/默认值

详细作用原理或应用

name

用户名

符合mysql用户名规范的字符串

用户唯一标识,用于登录校验

password

密码

用户密码校验

usingDecrypt

是否启用加密

可配置true/false,默认false

启用加密password项配置通过执行脚本encrypt.sh 0:{user}:{password}的结果进行配置
举例:
encrypt.sh 0:xxx:123456
fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ==
配置项:
password fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ==
user xxx
登录项:
-u xxx -p123456

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内容

1.3.3.1 user.privileges.schema

user.privileges 下的schema的dml权限,可配置多值


配置名称



配置内容



可选项/默认值



详细作用原理或应用



name



schema名称



用以标识对应schema



dml



dml权限



0000



权限判断,每一位分别表示INSERT UPDATE SELECT DELETE四种权限


1- 拥有权限 0-没有权限 例如拥有所有权限为1111


table


子元素


可配置多个



如果没有配置,则table继承schema的权限


1.3.3.2 user.privileges.schema.table


配置名称



配置内容



可选项/默认值



详细作用原理或应用



name



表格名称





在权限判断的时候作为key值



dml



dml权限



0000



权限判断,每一位分别表示INSERT UPDATE SELECT DELETE四种权限


1- 拥有权限 0-没有权限 例如拥有所有权限为1111

1.3.4 rwSplitUser(读写用户配置)

配置名称

配置内容

可选项/默认值

详细作用原理或应用

name

用户名

符合mysql用户名规范的字符串

用户唯一标识,用于登录校验

password

密码

用户密码校验

usingDecrypt

是否启用加密

可配置true/false,默认false

启用加密password项配置通过执行脚本encrypt.sh 0:{user}:{password}的结果进行配置
举例:
encrypt.sh 0:xxx:123456
fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ==
配置项:
password fP/nl3XPXrSfWjpQzit5lIOrRU1QRXuLTYtATUG0fGW2k5kdXUhKL5zf02hE6nGjdnSWrufVkJPUZpbQ2qX9uQ==
user xxx
登录项:
-u xxx -p123456

whiteIPs

可登录的ip的白名单

可选项

可以参考本配置文件中的whiteIPs内容

tenant

租户名

可选配置。和用户名相当于整个用户列表的联合主键

可以参考本配置文件中的tenant内容

dbGroup

该用户对应的数据库组dbGroup

单值配置

对应db.xml中的dbGroup名称

maxCon

负载限制,默认不做限制

正整数

用户的连接数限制,会在用户验证登录的时候进行校验,默认0,表示不做限制。 特别的,当系统级别的maxCon已经到达上限之后,本用户的maxCon会失效,不能新建连接

blacklist

blacklist的名称

可选配置

可以参考本配置文件中的blacklist内容

1.3.5 blacklist(黑名单配置)

配置名称 配置内容 配置范围/可选项 详细作用原理或应用
name blacklist的名称

用于被用户引用,标记黑名单

property 子元素,可以有多个 详细的黑名单校验规则 如果开启黑名单校验具体的校验规则将有 所有property来确定

1.3.5.1 blacklist.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中没有作用 暂不具有实际意义

1.3.6 tenant(租户配置)

dble支持两种方式的设置

  1. 用户:租户 这种方式以:分隔开用户和租户,一起作为登录的用户 如:

    mysql -u用户:租户 -p -h
    DriverManager.getConnection("jdbc:mysql://127.0.0.1:8066", "root2:tenant1", "123456");
  2. JDBC-connectionAttributes 在connectionAttributes中添加tenant指定租户名称 如:

    DriverManager.getConnection("jdbc:mysql://127.0.0.1:8066?connectionAttributes=tenant:tenant1", "root2", "123456");

以上两种方式中,若同时设置了1/2两种方式,则采用方式1的配置

1.3.7 whiteIPs(IP白名单)

默认不限制,值为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映射

1.3.8 完整例子

<?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>