2016-01-12 3 views
2

Я написал собственный обработчик проверки подлинности для WSO2 на основе инструкций в руководстве пользователя.есть способ установить код ответа/текст из пользовательского обработчика WSO2?

В целом, обработчик работает нормально, т. Е. При предоставлении правильных учетных данных он корректно запускает API, а при предоставлении ложных учетных данных он отклоняет API, но в этом случае - код состояния 202 с пустым текстом ответа возвращается «свернуться».

Есть ли способ контролировать возвращаемый код ответа или построить разумный текст ответа для таких случаев? Я бы предпочел вернуть код ответа «запрещено» или текст, говорящий «неправильные учетные данные», когда пользовательский обработчик решает отклонить вызов API.

Я вижу, что HandleRequest (MessageContext messageContext) возвращает boolean, поэтому не уверен, как отправить обратно желаемый код ответа и текст.

ответ

1

Ниже приведен пример кода, написанного для улавливания запроса, и если заголовок «Авторизация» недоступен, отправьте запрос обратно клиенту в качестве ответа.

Вы можете видеть, я добавил «HTTP_SC» заголовок со значением 401.

с помощью messageContext.setProperty("RESPONSE", "true");, мы можем отправить этот ответ клиенту, как réponse.

public boolean handleRequest(MessageContext messageContext) { 
     org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) messageContext) 
       .getAxis2MessageContext(); 
     Object headers = axis2MessageContext 
       .getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS); 

     try { 
      if (headers != null && headers instanceof Map) { 
       Map headersMap = (Map) headers; 
       if (headersMap.get("Authorization") == null) { 
        headersMap.clear(); 
        axis2MessageContext.setProperty("HTTP_SC", "401"); 
        headersMap.put("WWW-Authenticate", 
          "Basic realm=\"WSO2 ESB\""); 
        axis2MessageContext.setProperty("NO_ENTITY_BODY", 
          new Boolean("true")); 
        messageContext.setProperty("RESPONSE", "true"); 
        messageContext.setTo(null); 
        Axis2Sender.sendBack(messageContext); 
        return false; 

       } else { 

        return true; 
       } 
      } 
      return false; 

     } catch (Exception e) { 
      log.error("Unable to execute the authentication process : ", e); 
      return false; 
     } 

    } 

Надеюсь, это поможет вам. ура.

+0

Большое вам спасибо! Я подозреваю, что в вашем коде вы хотели «if (headersMap.get (« Авторизация »)! = Null) {...}" (а не '==') –

+0

Axis2Sender.sendBack (messageContext); отправьте сообщение клиенту. :) – krishan

+0

Этот код предназначен для проверки того, защищен ли входящий запрос с помощью основного Auth. Если основной Auth отключен, запрос отправляется обратно клиенту в качестве ответа. Вы можете изменить логику в соответствии с вашим требованием. В любом случае, используя «Axis2Sender.sendBack (messageContext)»; вы можете отправить запрос назад – krishan

 Смежные вопросы

  • Нет связанных вопросов^_^