【DataWorks最佳实践】权限及安全-风险识别规则响应案例

时间:2024-12-10 22:08:19

开发扩展程序示例代码如下:

重要

  • 此扩展程序示例基于步骤一中事件消息体中的dataRowSize字段实现下载行数风险判断。

  • 在配置响应时,如需实现“审批”,则需保证扩展程序在识别到用户风险行为时callbackExtensionRequest.setCheckResult()返回WARN;如需实现“阻断”,则callbackExtensionRequest.setCheckResult()应返回FAIL

  • 本文扩展程序代码以下载1000条数据进行判断举例说明,如果希望不同的下载条数触发不同的审批流,您可以配置多个扩展程序,详情请参见步骤三:配置风险识别规则。例如:

    • 第一个扩展程序仅在下载条数为0~2000时命中,对应审批流程1。

    • 第二个扩展程序仅在下载条数为2001及以上时命中,对应审批流程2。

package com.aliyun.dataworks.demo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dataworks.config.Constants;
import com.aliyun.dataworks.config.EventCheckEnum;
import com.aliyun.dataworks.config.ExtensionParamProperties;
import com.aliyun.dataworks.services.DataWorksOpenApiClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dataworks_public.model.v20200518.*;
import com.aliyuncs.exceptions.ClientException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author dataworks demo
 */
@RestController
@RequestMapping("/extensions")
public class ExtensionsController {

    @Autowired(required = false)
    private DataWorksOpenApiClient dataWorksOpenApiClient;

    @Autowired
    private ExtensionParamProperties extensionParamProperties;

    /**
     * 接收eventBridge推送过来的消息
     * @param jsonParam
     */
    @PostMapping("/consumer")
    public void consumerEventBridge(@RequestBody String jsonParam){
        JSONObject jsonObj = JSON.parseObject(jsonParam);
        String eventCode = jsonObj.getString(Constants.EVENT_CODE_FILED);
        if(Constants.COMMIT_FILE_EVENT_CODE.equals(eventCode) || Constants.DEPLOY_FILE_EVENT_CODE.equals(eventCode)){
            //初始化client
            IAcsClient client = dataWorksOpenApiClient.createClient();
            try {
                //当前事件参数信息
                String messageId = jsonObj.getString("id");
                JSONObject data = jsonObj.getObject("data", JSONObject.class);
               // Long projectId = data.getLong("appId");

                //初始化事件回调
                CallbackExtensionRequest callbackExtensionRequest = new CallbackExtensionRequest();
                callbackExtensionRequest.setMessageId(messageId);
                callbackExtensionRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
                JSONObject eventBody = data.getJSONObject("eventBody");
                Long dataRowSize = eventBody.getLong("dataRowSize");
                //获取扩展程序选项配置在项目空间下的配置
                GetOptionValueForProjectRequest getOptionValueForProjectRequest = new GetOptionValueForProjectRequest();
                //全局扩展点事件的配置信息所属projectId默认为-1
                getOptionValueForProjectRequest.setProjectId("-1");
                getOptionValueForProjectRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
                GetOptionValueForProjectResponse getOptionValueForProjectResponse = client.getAcsResponse(getOptionValueForProjectRequest);
                JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getOptionValue());
                //注意:这里需根据在DataWorks上实际设置格式来填写
                Long maxDataRowSize = jsonObject.getLong("dataRowSize");
                //判断代码是否包含限制函数
                if(dataRowSize > 1000){

                    callbackExtensionRequest.setCheckResult(EventCheckEnum.FAIL.getCode());
                    callbackExtensionRequest.setCheckMessage("下载的行数超过限制数");
                }else{//成功回调
                    callbackExtensionRequest.setCheckResult(EventCheckEnum.OK.getCode());
                }
                //回调DataWorks
                CallbackExtensionResponse acsResponse = client.getAcsResponse(callbackExtensionRequest);
                //请求的唯一标识,用于后续错误排查使用
                System.out.println("acsResponse:" + acsResponse.getRequestId());
            } catch (ClientException e) {
                //请求的唯一标识,用于后续错误排查使用
                System.out.println("RequestId:" + e.getRequestId());
                //错误状态码
                System.out.println("ErrCode:" + e.getErrCode());
                //错误描述信息
                System.out.println("ErrMsg:" + e.getErrMsg());
            }
        }else{
            System.out.println("未能过滤其他事件,请检查配置步骤");
        }
    }
}