Skip to content

Commit a798896

Browse files
committed
Server: 非开放请求不允许传远程函数;解决 Access 表里配置 name 和 alias 未成功实现表映射;完善远程函数调用在函数格式错误时的报错信息
1 parent dc2f49f commit a798896

File tree

6 files changed

+20
-13
lines changed

6 files changed

+20
-13
lines changed

APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/server/DemoSQLConfig.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121

2222
import com.alibaba.fastjson.JSONObject;
2323

24-
import apijson.demo.server.model.Privacy;
25-
import apijson.demo.server.model.User;
2624
import zuo.biao.apijson.RequestMethod;
2725
import zuo.biao.apijson.server.AbstractSQLConfig;
2826
import zuo.biao.apijson.server.Join;
@@ -38,14 +36,15 @@ public class DemoSQLConfig extends AbstractSQLConfig {
3836

3937
public static final Callback SIMPLE_CALLBACK;
4038

41-
39+
4240
static {
4341
//TODO 默认模式名,改成你自己的
4442
DEFAULT_SCHEMA = "sys";
45-
46-
//表名映射,隐藏真实表名,对安全要求很高的表可以这么做
47-
TABLE_KEY_MAP.put(User.class.getSimpleName(), "apijson_user");
48-
TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy");
43+
44+
// 由 DemoVerifier.init 方法读取数据库 Access 表来替代手动输入配置
45+
// //表名映射,隐藏真实表名,对安全要求很高的表可以这么做
46+
// TABLE_KEY_MAP.put(User.class.getSimpleName(), "apijson_user");
47+
// TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy");
4948

5049
//主键名映射
5150
SIMPLE_CALLBACK = new SimpleCallback() {
@@ -82,7 +81,7 @@ public String getUserIdKey(String database, String schema, String table) {
8281
public String getDBVersion() {
8382
return "5.7.22"; //"8.0.11"; //TODO 改成你自己的 MySQL 或 PostgreSQL 数据库版本号 //MYSQL 8 和 7 使用的 JDBC 配置不一样
8483
}
85-
84+
8685
@Override
8786
public String getDBUri() {
8887
//TODO 改成你自己的,TiDB 默认端口为 4000

APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/server/DemoVerifier.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ public static JSONObject init(boolean shutdownWhenServerError) throws ServerExce
146146
}
147147
}
148148

149+
DemoSQLConfig.TABLE_KEY_MAP.put(alias, name);
149150
}
150151

151152
Log.d(TAG, "init for /> ACCESS_MAP.size() = " + ACCESS_MAP.size() + " >>>>>>>>>>>>>>>>>>>>>>>");

APIJSON-Java-Server/APIJSONORM/src/main/java/zuo/biao/apijson/server/AbstractParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ public JSONObject parseCorrectRequest() throws Exception {
591591

592592
String tag = requestObject.getString(JSONRequest.KEY_TAG);
593593
if (StringUtil.isNotEmpty(tag, true) == false) {
594-
throw new IllegalArgumentException("请在最外层设置tag!一般是Table名,例如 \"tag\": \"User\" ");
594+
throw new IllegalArgumentException("请在最外层设置 tag !一般是 Table 名,例如 \"tag\": \"User\" ");
595595
}
596596
setTag(tag);
597597

@@ -605,7 +605,7 @@ public JSONObject parseCorrectRequest() throws Exception {
605605
error = e.getMessage();
606606
}
607607
if (object == null) {//empty表示随意操作 || object.isEmpty()) {
608-
throw new UnsupportedOperationException("非开放请求必须是Request表中校验规则允许的操作\n " + error);
608+
throw new UnsupportedOperationException("非开放请求必须是后端 Request 表中校验规则允许的操作\n " + error);
609609
}
610610

611611
JSONObject target = null;

APIJSON-Java-Server/APIJSONORM/src/main/java/zuo/biao/apijson/server/AbstractSQLConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2603,7 +2603,7 @@ else if (key.endsWith("}{")) {//被包含 EXISTS,或者说key对应值处于va
26032603
else if (key.endsWith("<>")) {//包含 json_contains,或者说value处于key对应值的范围内。查询时处理
26042604
key = key.substring(0, key.length() - 2);
26052605
}
2606-
else if (key.endsWith("()")) {//方法,查询完后处理,先用一个Map<key,function>保存
2606+
else if (key.endsWith("()")) {//方法,查询完后处理,先用一个Map<key,function>保存
26072607
key = key.substring(0, key.length() - 2);
26082608
}
26092609
else if (key.endsWith("@")) {//引用,引用对象查询完后处理。fillTarget中暂时不用处理,因为非GET请求都是由给定的id确定,不需要引用

APIJSON-Java-Server/APIJSONORM/src/main/java/zuo/biao/apijson/server/RemoteFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public static FunctionBean parseFunction(@NotNull String function, @NotNull JSON
125125

126126
int start = function.indexOf("(");
127127
int end = function.lastIndexOf(")");
128-
String method = end != function.length() - 1 ? null : function.substring(0, start);
128+
String method = (start <= 0 || end != function.length() - 1) ? null : function.substring(0, start);
129129
if (StringUtil.isEmpty(method, true)) {
130130
throw new IllegalArgumentException("字符 " + function + " 不合法!函数的名称 function 不能为空,"
131131
+ "且必须为 function(key0,key1,...) 这种单函数格式!"

APIJSON-Java-Server/APIJSONORM/src/main/java/zuo/biao/apijson/server/Structure.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,16 @@ public static JSONObject parse(String name, JSONObject target, JSONObject real
351351
real.remove(rk);
352352
continue;
353353
}
354+
355+
Object rv = real.get(rk);
356+
357+
//不允许传远程函数,只能后端配置
358+
if (rk.endsWith("()") && rv instanceof String) {
359+
throw new UnsupportedOperationException(rk + " 不合法!非开放请求不允许传远程函数 key():\"fun()\" !");
360+
}
354361

355362
//不在target内的 key:{}
356-
if (rk.startsWith("@") == false && objKeySet.contains(rk) == false && real.get(rk) instanceof JSONObject) {
363+
if (rk.startsWith("@") == false && objKeySet.contains(rk) == false && rv instanceof JSONObject) {
357364
throw new UnsupportedOperationException(name + " 里面不允许传 " + rk + ":{} !");
358365
}
359366
}

0 commit comments

Comments
 (0)