diff --git a/src/main/java/com/eactive/eai/adapter/http/dynamic/filter/ApiAuthFilter.java b/src/main/java/com/eactive/eai/adapter/http/dynamic/filter/ApiAuthFilter.java index 97d4967..afe5c72 100644 --- a/src/main/java/com/eactive/eai/adapter/http/dynamic/filter/ApiAuthFilter.java +++ b/src/main/java/com/eactive/eai/adapter/http/dynamic/filter/ApiAuthFilter.java @@ -93,17 +93,23 @@ public class ApiAuthFilter implements HttpAdapterFilter { @Override public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop, HttpServletRequest request, HttpServletResponse response) throws Exception { - String apiId = assignApiId(adptGrpName, adptName, message, prop, request); - if (StringUtils.isBlank(apiId)) { - throw new JwtAuthException(ERROR_AUTHENTICATION_FAIL, "Can not find apiId(apiCode) info"); + String apiId = prop.getProperty("FINAL_STD_MESSAGE_KEY"); + String eaiSvcCd = prop.getProperty("API_SERVICE_CODE"); + if(StringUtils.isEmpty(eaiSvcCd)) { + if(StringUtils.isEmpty(apiId)) + apiId = assignApiId(adptGrpName, adptName, message, prop, request); + + if (StringUtils.isBlank(apiId)) { + throw new JwtAuthException(ERROR_AUTHENTICATION_FAIL, "Can not find apiId(apiCode) info"); + } + + /** + * TODO: 중복되는 표준메시지 조회로 리소드 낭비가 있을 수 있으므로 체크 자체를 추후 RequestProcessor혹은 RestProcessor로 이동 필요 해 보임 + * ApiRequestProcessor을 만드는것도 괜찮을 수 있을 것 같으나 관리가 안될 것 같음 + */ + StandardMessage standardMessage = STDMessageManager.getInstance().getSTDMessage(apiId); + eaiSvcCd = StandardMessageManager.getInstance().getMapper().getEaiSvcCode(standardMessage); } - - /** - * TODO: 중복되는 표준메시지 조회로 리소드 낭비가 있을 수 있으므로 체크 자체를 추후 RequestProcessor혹은 RestProcessor로 이동 필요 해 보임 - * ApiRequestProcessor을 만드는것도 괜찮을 수 있을 것 같으나 관리가 안될 것 같음 - */ - StandardMessage standardMessage = STDMessageManager.getInstance().getSTDMessage(apiId); - String eaiSvcCd = StandardMessageManager.getInstance().getMapper().getEaiSvcCode(standardMessage); // if (StringUtils.isNotEmpty(eaiSvcCd) && !StringUtils.equals(eaiSvcCd, )) // eaiSvcCd = prop.getProperty("API_SERVICE_CODE"); EAIMessage eaiMessage = EAIMessageManager.getInstance().getEAIMessage(eaiSvcCd); diff --git a/src/main/java/com/eactive/eai/adapter/http/dynamic/filter/ApiKeyExtractFilter.java b/src/main/java/com/eactive/eai/adapter/http/dynamic/filter/ApiKeyExtractFilter.java new file mode 100644 index 0000000..e5c7cec --- /dev/null +++ b/src/main/java/com/eactive/eai/adapter/http/dynamic/filter/ApiKeyExtractFilter.java @@ -0,0 +1,95 @@ +package com.eactive.eai.adapter.http.dynamic.filter; + +import java.util.Properties; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; + +import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilter; +import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthException; +import com.eactive.eai.common.message.EAIMessage; +import com.eactive.eai.common.message.EAIMessageManager; +import com.eactive.eai.common.stdmessage.STDMessageManager; +import com.eactive.eai.common.stdmessage.STDMsgInfoAddOnVO; +import com.eactive.eai.common.util.Logger; +import com.eactive.eai.common.util.MessageUtil; +import com.eactive.eai.inbound.action.ActionFactory; +import com.eactive.eai.inbound.action.RequestAction; +import com.eactive.eai.inbound.processor.Processor; +import com.eactive.eai.message.StandardMessage; +import com.eactive.eai.message.manager.StandardMessageManager; +import com.eactive.eai.message.service.InterfaceMapper; + +/** + * 요청 url를 기반으로 interface id 찾기 + * tx prop에 STD_MESSAGE_KEY, FINAL_STD_MESSAGE_KEY, INTERFACE_ID, EAI_MESSAGE 세팅 + */ +public class ApiKeyExtractFilter implements HttpAdapterFilter { + static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + public static final String STD_MESSAGE_KEY = "STD_MESSAGE_KEY"; + public static final String FINAL_STD_MESSAGE_KEY = "FINAL_STD_MESSAGE_KEY"; + public static final String API_SERVICE_CODE = "API_SERVICE_CODE"; + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop, + HttpServletRequest request, HttpServletResponse response) throws Exception { + + String actionName = prop.getProperty(Processor.REQUEST_ACTION); + RequestAction action = ActionFactory.createAction(actionName); + action.setAdapterInfo(adptGrpName, adptName, prop); + String[] keys = action.perform(message); + String requestPath = keys[0]; + + prop.setProperty(STD_MESSAGE_KEY, requestPath);// action class 통해서 생성 + + // PathVariable 지원 추가 + String ruledPath = getMatchedKey(requestPath); + if(ruledPath == null) + throw new IllegalAccessException("path not found - " + requestPath); + prop.setProperty(FINAL_STD_MESSAGE_KEY, ruledPath);// StandardMessageUtil.getMatchedKey(), url + // pathvariable도 처리 + + String apiId = prop.getProperty(ApiKeyExtractFilter.FINAL_STD_MESSAGE_KEY); + if (StringUtils.isBlank(apiId)) { + throw new JwtAuthException(MessageUtil.ERROR_CODE_AUTH_FAIL, "Can not find apiId(apiCode) info"); + } + + String apiSvcCode = this.getEaiSvcCode(apiId); + prop.put(API_SERVICE_CODE, apiSvcCode); + + return message; + } + + private String getEaiSvcCode(String apiId) throws Exception { + StandardMessage standardMessage = STDMessageManager.getInstance().getSTDMessage(apiId); + return StandardMessageManager.getInstance().getMapper().getEaiSvcCode(standardMessage); + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Object resultMessage, Properties prop, + HttpServletRequest request, HttpServletResponse response) throws Exception { + return resultMessage; + } + + /** + * API 서비스에서 실제 요청된 path를 설정된 PathVariable 형태의 key를 찾는다 + * ex) /api/bank/account/12345 --> /api/bank/account/{accountNo} + * @param key + * @param actionName + * @return + */ + public static String getMatchedKey(String key) { + STDMessageManager stdMessageManager = STDMessageManager.getInstance(); + String[] keys = stdMessageManager.getAllSTDMessageKeys(); + for (String keyStr : keys) { + if (StringUtils.equals(key, keyStr)) { + return keyStr; + } + } + + return stdMessageManager.getMatchedPathVariable(key); + } +}