This is an automated email from the ASF dual-hosted git repository.
benjobs pushed a commit to branch dev-2.1.4
in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git
The following commit(s) were added to refs/heads/dev-2.1.4 by this push:
new 4b60486e7 [Improve] api access permission improvement
4b60486e7 is described below
commit 4b60486e7e70e91f971c3c558bbac756b908cad7
Author: benjobs <[email protected]>
AuthorDate: Tue Apr 16 00:37:26 2024 +0800
[Improve] api access permission improvement
---
.../core/controller/FlinkSqlController.java | 22 ++++++++----
.../core/controller/SavePointController.java | 25 ++++++-------
.../console/core/controller/SettingController.java | 1 +
.../streampark/console/core/entity/FlinkSql.java | 2 ++
.../streampark/console/core/entity/SavePoint.java | 2 ++
.../src/api/flink/app/flinkSql.ts | 2 +-
.../src/api/flink/app/savepoint.ts | 5 +--
.../flink/app/components/AppDetail/DetailTab.vue | 5 +--
.../components/AppDetail/FlinkSqlCompareModal.vue | 6 +++-
.../src/views/flink/app/components/FlinkSql.vue | 41 ++++++++++++----------
.../src/views/flink/app/hooks/useDetail.ts | 2 +-
.../src/views/flink/app/hooks/useEditStreamPark.ts | 7 ++--
12 files changed, 68 insertions(+), 52 deletions(-)
diff --git
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkSqlController.java
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkSqlController.java
index 2fad82e5b..3abef9bcf 100644
---
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkSqlController.java
+++
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/FlinkSqlController.java
@@ -19,7 +19,9 @@ package org.apache.streampark.console.core.controller;
import org.apache.streampark.console.base.domain.RestRequest;
import org.apache.streampark.console.base.domain.RestResponse;
+import org.apache.streampark.console.base.exception.ApiAlertException;
import org.apache.streampark.console.base.exception.InternalException;
+import org.apache.streampark.console.core.annotation.PermissionScope;
import org.apache.streampark.console.core.entity.Application;
import org.apache.streampark.console.core.entity.FlinkSql;
import org.apache.streampark.console.core.service.FlinkSqlService;
@@ -85,22 +87,27 @@ public class FlinkSqlController {
@Operation(summary = "List the application sql")
@PostMapping("list")
- public RestResponse list(Long appId, RestRequest request) {
- IPage<FlinkSql> page = flinkSqlService.page(appId, request);
+ @PermissionScope(app = "#flinkSql.appId", team = "#flinkSql.teamId")
+ public RestResponse list(FlinkSql flinkSql, RestRequest request) {
+ IPage<FlinkSql> page = flinkSqlService.page(flinkSql.getAppId(), request);
return RestResponse.success(page);
}
@Operation(summary = "Delete sql")
@PostMapping("delete")
@RequiresPermissions("sql:delete")
- public RestResponse delete(Long id) {
- Boolean deleted = flinkSqlService.removeById(id);
+ @PermissionScope(app = "#flinkSql.appId", team = "#teamId")
+ public RestResponse delete(FlinkSql flinkSql) {
+ Boolean deleted = flinkSqlService.removeById(flinkSql.getId());
return RestResponse.success(deleted);
}
@Operation(summary = "List sql by ids")
@PostMapping("get")
- public RestResponse get(String id) throws InternalException {
+ @PermissionScope(app = "#appId", team = "#teamId")
+ public RestResponse get(Long appId, Long teamId, String id) throws
InternalException {
+ ApiAlertException.throwIfTrue(
+ appId == null || teamId == null, "Permission denied, appId and teamId
cannot be null");
String[] array = id.split(",");
FlinkSql flinkSql1 = flinkSqlService.getById(array[0]);
flinkSql1.base64Encode();
@@ -114,8 +121,9 @@ public class FlinkSqlController {
@Operation(summary = "List the applications sql histories")
@PostMapping("history")
- public RestResponse sqlhistory(Application application) {
- List<FlinkSql> sqlList = flinkSqlService.history(application);
+ @PermissionScope(app = "#app.id", team = "app.teamId")
+ public RestResponse sqlhistory(Application app) {
+ List<FlinkSql> sqlList = flinkSqlService.history(app);
return RestResponse.success(sqlList);
}
diff --git
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SavePointController.java
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SavePointController.java
index b5d69dde1..1e69f5e95 100644
---
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SavePointController.java
+++
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SavePointController.java
@@ -21,6 +21,7 @@ import org.apache.streampark.console.base.domain.RestRequest;
import org.apache.streampark.console.base.domain.RestResponse;
import org.apache.streampark.console.base.exception.InternalException;
import org.apache.streampark.console.core.annotation.ApiAccess;
+import org.apache.streampark.console.core.annotation.PermissionScope;
import org.apache.streampark.console.core.entity.Application;
import org.apache.streampark.console.core.entity.SavePoint;
import org.apache.streampark.console.core.service.ApplicationService;
@@ -54,27 +55,22 @@ public class SavePointController {
@Autowired private SavePointService savePointService;
- @Operation(summary = "Get application savepoint latest")
- @PostMapping("latest")
- public RestResponse latest(Long appId) {
- SavePoint savePoint = savePointService.getLatest(appId);
- return RestResponse.success(savePoint);
- }
-
@Operation(summary = "List application savepoint histories")
@PostMapping("history")
- public RestResponse history(SavePoint savePoint, RestRequest request) {
- IPage<SavePoint> page = savePointService.page(savePoint, request);
+ @PermissionScope(app = "#sp.appId", team = "#sp.teamId")
+ public RestResponse history(SavePoint sp, RestRequest request) {
+ IPage<SavePoint> page = savePointService.page(sp, request);
return RestResponse.success(page);
}
@Operation(summary = "Delete savepoint")
@PostMapping("delete")
@RequiresPermissions("savepoint:delete")
- public RestResponse delete(Long id) throws InternalException {
- SavePoint savePoint = savePointService.getById(id);
+ @PermissionScope(app = "#sp.appId", team = "#sp.teamId")
+ public RestResponse delete(SavePoint sp) throws InternalException {
+ SavePoint savePoint = savePointService.getById(sp.getId());
Application application = applicationService.getById(savePoint.getAppId());
- Boolean deleted = savePointService.delete(id, application);
+ Boolean deleted = savePointService.delete(sp.getId(), application);
return RestResponse.success(deleted);
}
@@ -96,8 +92,9 @@ public class SavePointController {
@ApiAccess
@PostMapping("trigger")
@RequiresPermissions("savepoint:trigger")
- public RestResponse trigger(Long appId, @Nullable String savepointPath) {
- savePointService.trigger(appId, savepointPath);
+ @PermissionScope(app = "#savePoint.appId", team = "#savePoint.teamId")
+ public RestResponse trigger(SavePoint savePoint, @Nullable String
savepointPath) {
+ savePointService.trigger(savePoint.getAppId(), savepointPath);
return RestResponse.success(true);
}
}
diff --git
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
index 12555964d..f3926ea57 100644
---
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
+++
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
@@ -60,6 +60,7 @@ public class SettingController {
@Operation(summary = "Get setting")
@PostMapping("get")
+ @RequiresPermissions("setting:view")
public RestResponse get(String key) {
Setting setting = settingService.get(key);
return RestResponse.success(setting);
diff --git
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/FlinkSql.java
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/FlinkSql.java
index 5b732d77d..474ebc5fb 100644
---
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/FlinkSql.java
+++
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/FlinkSql.java
@@ -62,6 +62,8 @@ public class FlinkSql {
/** dependency diff */
private transient boolean dependencyDifference = false;
+ private transient Long teamId;
+
public FlinkSql() {}
public FlinkSql(Application application) {
diff --git
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SavePoint.java
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SavePoint.java
index 79a4e3871..dab85f43d 100644
---
a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SavePoint.java
+++
b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/SavePoint.java
@@ -52,4 +52,6 @@ public class SavePoint {
private Date triggerTime;
private Date createTime;
+
+ private transient Long teamId;
}
diff --git
a/streampark-console/streampark-console-webapp/src/api/flink/app/flinkSql.ts
b/streampark-console/streampark-console-webapp/src/api/flink/app/flinkSql.ts
index 1ec71f79e..e4af1df51 100644
--- a/streampark-console/streampark-console-webapp/src/api/flink/app/flinkSql.ts
+++ b/streampark-console/streampark-console-webapp/src/api/flink/app/flinkSql.ts
@@ -43,7 +43,7 @@ export function fetchFlinkSqlList(data) {
});
}
-export function fetchRemoveFlinkSql(data: { id: string }): Promise<boolean> {
+export function fetchRemoveFlinkSql(data: { appId: any; id: any }):
Promise<boolean> {
return defHttp.post({
url: FLINK_SQL_API.DELETE,
data,
diff --git
a/streampark-console/streampark-console-webapp/src/api/flink/app/savepoint.ts
b/streampark-console/streampark-console-webapp/src/api/flink/app/savepoint.ts
index 359b53136..0f030e0c8 100644
---
a/streampark-console/streampark-console-webapp/src/api/flink/app/savepoint.ts
+++
b/streampark-console/streampark-console-webapp/src/api/flink/app/savepoint.ts
@@ -23,9 +23,6 @@ enum SAVE_POINT_API {
TRIGGER = '/flink/savepoint/trigger',
}
-export function fetchLatest(data: Recordable) {
- return defHttp.post({ url: SAVE_POINT_API.LATEST, data });
-}
export function fetchSavePonitHistory(data: Recordable) {
return defHttp.post({ url: SAVE_POINT_API.HISTORY, data });
}
@@ -34,7 +31,7 @@ export function fetchSavePonitHistory(data: Recordable) {
* @param data id
* @returns {Promise<boolean>}
*/
-export function fetchRemoveSavePoint(data: { id: string }): Promise<boolean> {
+export function fetchRemoveSavePoint(data: { appId: any; id: any }):
Promise<boolean> {
return defHttp.post({
url: SAVE_POINT_API.DELETE,
data,
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/DetailTab.vue
b/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/DetailTab.vue
index dc8853e5c..d1298d330 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/DetailTab.vue
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/DetailTab.vue
@@ -232,6 +232,7 @@
try {
const res = await fetchFlinkSql({
id: record.id,
+ appId: record.appId,
});
openFlinkDrawer(true, {
sql: decodeByBase64(res.sql),
@@ -251,7 +252,7 @@
/* delete flink sql */
async function handleDeleteFlinkSql(record: Recordable) {
- await fetchRemoveFlinkSql({ id: record.id });
+ await fetchRemoveFlinkSql({ id: record.id, appId: record.appId });
await reloadFlinkSql();
}
@@ -344,7 +345,7 @@
/* delete savePoint */
async function handleDeleteSavePoint(record: Recordable) {
- await fetchRemoveSavePoint({ id: record.id });
+ await fetchRemoveSavePoint({ id: record.id, appId: record.appId });
await reloadSavePoint();
}
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/FlinkSqlCompareModal.vue
b/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/FlinkSqlCompareModal.vue
index 04f185e6e..eb00bbc71 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/FlinkSqlCompareModal.vue
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppDetail/FlinkSqlCompareModal.vue
@@ -40,6 +40,7 @@
const submitLoading = ref<boolean>(false);
const compareRecord = reactive<Recordable>({});
const values = useDetailProviderContext();
+ const appId = ref<any>();
const [registerFlinkSqlDifferentDrawer, { openDrawer: openFlinkSqlDiffDrawer
}] = useDrawer();
const [registerModal, { closeModal }] = useModalInner((data) => {
@@ -47,8 +48,9 @@
});
async function onReceiveModalData(data) {
+ appId.value = toRaw(values).app.id;
const res = await fetchFlinkSqlList({
- appId: toRaw(values).app.id,
+ appId: appId.value,
pageNo: 1,
pageSize: 999999,
});
@@ -83,11 +85,13 @@
try {
const source = await fetchFlinkSql({
id: compareRecord.id,
+ appId: appId.value,
});
const sourceSql = decodeByBase64(source.sql);
const sourceVersion = source.version;
const target = await fetchFlinkSql({
id: values.target,
+ appId: appId.value,
});
const targetSql = decodeByBase64(target.sql);
const targetVersion = target.version;
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/components/FlinkSql.vue
b/streampark-console/streampark-console-webapp/src/views/flink/app/components/FlinkSql.vue
index 247b0d84c..2dd8864b0 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/components/FlinkSql.vue
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/components/FlinkSql.vue
@@ -39,7 +39,7 @@
const { t } = useI18n();
const flinkSql = ref();
- const vertifyRes = reactive({
+ const verifyRes = reactive({
errorMsg: '',
verified: false,
errorStart: 0,
@@ -55,6 +55,9 @@
type: String,
default: '',
},
+ appId: {
+ type: String as PropType<Nullable<string>>,
+ },
versionId: {
type: String as PropType<Nullable<string>>,
},
@@ -68,7 +71,7 @@
/* verify */
async function handleVerifySql() {
if (isEmpty(props.value)) {
- vertifyRes.errorMsg = 'empty sql';
+ verifyRes.errorMsg = 'empty sql';
return false;
}
@@ -83,22 +86,22 @@
});
const success = data.data === true || data.data === 'true';
if (success) {
- vertifyRes.verified = true;
- vertifyRes.errorMsg = '';
+ verifyRes.verified = true;
+ verifyRes.errorMsg = '';
syntaxError();
return true;
} else {
- vertifyRes.errorStart = parseInt(data.start);
- vertifyRes.errorEnd = parseInt(data.end);
+ verifyRes.errorStart = parseInt(data.start);
+ verifyRes.errorEnd = parseInt(data.end);
switch (data.type) {
case 4:
- vertifyRes.errorMsg = 'Unsupported sql';
+ verifyRes.errorMsg = 'Unsupported sql';
break;
case 5:
- vertifyRes.errorMsg = "SQL is not endWith ';'";
+ verifyRes.errorMsg = "SQL is not endWith ';'";
break;
default:
- vertifyRes.errorMsg = data.message;
+ verifyRes.errorMsg = data.message;
break;
}
syntaxError();
@@ -116,14 +119,14 @@
if (editor) {
const model = editor.getModel();
const monaco = await getMonacoInstance();
- if (vertifyRes.errorMsg) {
+ if (verifyRes.errorMsg) {
try {
monaco.editor.setModelMarkers(model, 'sql', [
{
- startLineNumber: vertifyRes.errorStart,
- endLineNumber: vertifyRes.errorEnd,
+ startLineNumber: verifyRes.errorStart,
+ endLineNumber: verifyRes.errorEnd,
severity: monaco.MarkerSeverity.Error,
- message: vertifyRes.errorMsg,
+ message: verifyRes.errorMsg,
},
]);
} catch (e) {
@@ -173,7 +176,7 @@
const flinkEditorClass = computed(() => {
return {
...fullEditorClass.value,
- ['syntax-' + (vertifyRes.errorMsg ? 'false' : 'true')]: true,
+ ['syntax-' + (verifyRes.errorMsg ? 'false' : 'true')]: true,
};
});
@@ -226,11 +229,11 @@
</ButtonGroup>
<div class="flex items-center justify-between" v-else>
<div class="mt-10px flex-1 mr-10px overflow-hidden whitespace-nowrap">
- <div class="text-red-600 overflow-ellipsis overflow-hidden"
v-if="vertifyRes.errorMsg">
- {{ vertifyRes.errorMsg }}
+ <div class="text-red-600 overflow-ellipsis overflow-hidden"
v-if="verifyRes.errorMsg">
+ {{ verifyRes.errorMsg }}
</div>
<div v-else class="text-green-700">
- <span v-if="vertifyRes.verified"> {{
t('flink.app.flinkSql.successful') }} </span>
+ <span v-if="verifyRes.verified"> {{
t('flink.app.flinkSql.successful') }} </span>
</div>
</div>
<div class="flinksql-tool">
@@ -262,9 +265,9 @@
</div>
</div>
<p class="conf-desc mt-10px" v-if="!fullScreenStatus">
- <span class="text-red-600" v-if="vertifyRes.errorMsg"> {{
vertifyRes.errorMsg }} </span>
+ <span class="text-red-600" v-if="verifyRes.errorMsg"> {{
verifyRes.errorMsg }} </span>
<span v-else class="text-green-700">
- <span v-if="vertifyRes.verified"> {{ t('flink.app.flinkSql.successful')
}} </span>
+ <span v-if="verifyRes.verified"> {{ t('flink.app.flinkSql.successful')
}} </span>
</span>
</p>
</template>
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useDetail.ts
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useDetail.ts
index 9e6959d5c..c210de303 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useDetail.ts
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useDetail.ts
@@ -108,7 +108,7 @@ export const userDetail = (
}
/* delete savePoint */
async function handleDeleteSavePoint(record: Recordable) {
- await fetchRemoveSavePoint({ id: record.id });
+ await fetchRemoveSavePoint({ id: record.id, appId: record.appId });
reloadSavePoint();
}
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditStreamPark.ts
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditStreamPark.ts
index 3ad8db2cd..3fb2b0c75 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditStreamPark.ts
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditStreamPark.ts
@@ -37,6 +37,7 @@ export const useEditStreamParkSchema = (
) => {
const flinkSql = ref();
const route = useRoute();
+ const appId = route.query.appId as string;
const {
alerts,
flinkEnvs,
@@ -48,14 +49,14 @@ export const useEditStreamParkSchema = (
getExecutionModeSchema,
suggestions,
} = useCreateAndEditSchema(dependencyRef, {
- appId: route.query.appId as string,
+ appId: appId,
mode: 'streampark',
});
const { createMessage } = useMessage();
const [registerDifferentDrawer, { openDrawer: openDiffDrawer }] =
useDrawer();
async function handleChangeSQL(v: string) {
- const res = await fetchFlinkSql({ id: v });
+ const res = await fetchFlinkSql({ id: v, appId: appId });
flinkSql.value?.setContent(decodeByBase64(res.sql));
console.log('res', flinkSql.value);
unref(dependencyRef)?.setDefaultValue(JSON.parse(res.dependency || '{}'));
@@ -66,7 +67,7 @@ export const useEditStreamParkSchema = (
createMessage.warning('Two versions must be selected for comparison');
return Promise.reject('error, compareSQL array length less thatn 2');
}
- const res = await fetchFlinkSql({ id: compareSQL.join(',') });
+ const res = await fetchFlinkSql({ appId: appId, id: compareSQL.join(',')
});
const obj1 = res[0];
const obj2 = res[1];
const sql1 = decodeByBase64(obj1.sql);