Настройте различные обработчики для API на основе метода HTTP в файле синапса WSO2.

У меня есть файл синапса WSO2 для обработки запросов API на уровне шлюза. Я настроил GET и POST/PUT для конечной точки, как показано ниже. У меня есть собственный обработчик, который позволяет определенному хосту вызывать эти API. У меня есть требование разрешить GET с любого хоста и POST/PUT только с определенного хоста. Однако я не могу настроить его в своем файле синапса, потому что обработчики, которые мы определяем в файле, применяются ко всем методам HTTP. Есть ли способ настроить обработчики на основе метода HTTP для той же конечной точки/контекста. Как сделать так, чтобы мой собственный обработчик (com.abc.wso2.handler.HostRestrictionHandler) применялся только к вызовам POST?PUT? Ниже моя конфигурация.

<api xmlns="http://ws.apache.org/ns/synapse" context="/user/notification/v3" version="v2" version-type="context">  
  <resource methods="GET" uri-template="/*"> 
    <inSequence> 
      <class name="org.wso2.carbon.apimgt.gateway.mediators.TokenPasser"/>  
      <filter regex="PRODUCTION" source="$ctx:AM_KEY_TYPE"> 
        <then> 
          <class name="com.abc.mediators.DispatchMediator"> 
            <property name="url" value="http://api.{HOST_NAME}.com/user/notification/v3"/> 
          </class>  
          <send> 
            <endpoint name="Notification_API"> 
              <address> 
                <timeout> 
                  <duration>30000</duration>  
                  <responseAction>fault</responseAction> 
                </timeout>  
                <suspendOnFailure> 
                  <errorCodes>-1</errorCodes>  
                  <initialDuration>0</initialDuration>  
                  <progressionFactor>1.0</progressionFactor>  
                  <maximumDuration>0</maximumDuration> 
                </suspendOnFailure>  
                <markForSuspension> 
                  <errorCodes>-1</errorCodes> 
                </markForSuspension> 
              </address> 
            </endpoint> 
          </send>
        </then>  
        <else> 
          <sequence key="_sandbox_key_error_"/> 
        </else> 
      </filter> 
    </inSequence>  
    <outSequence> 
      <send/> 
    </outSequence> 
  </resource>  
  <resource methods="POST PUT" uri-template="/*"> 
    <inSequence>
      <property name="X-Forwarded-Host" scope="transport" expression="$trp:Host"/>
      <class name="org.wso2.carbon.apimgt.gateway.mediators.TokenPasser"/>  
      <filter regex="PRODUCTION" source="$ctx:AM_KEY_TYPE"> 
        <then> 
          <class name="com.abc.mediators.DispatchMediator"> 
            <property name="url" value="http://api.{HOST_NAME}.com/user/notification/v3"/> 
          </class>  
          <send> 
            <endpoint name="Notification_API_2"> 
              <address> 
                <timeout> 
                  <duration>30000</duration>  
                  <responseAction>fault</responseAction> 
                </timeout>  
                <suspendOnFailure> 
                  <errorCodes>-1</errorCodes>  
                  <initialDuration>0</initialDuration>  
                  <progressionFactor>1.0</progressionFactor>  
                  <maximumDuration>0</maximumDuration> 
                </suspendOnFailure>  
                <markForSuspension> 
                  <errorCodes>-1</errorCodes> 
                </markForSuspension> 
              </address> 
            </endpoint> 
          </send>
        </then>  
        <else> 
          <sequence key="_sandbox_key_error_"/> 
        </else> 
      </filter> 
    </inSequence>  
    <outSequence> 
      <send/> 
    </outSequence> 
  </resource>  
  <handlers>
      <handler class="com.abc.wso2.handler.HostRestrictionHandler">
        <property name="allowedHosts" value="my.customhost.com" />
      </handler>
  </handlers> 
</api>

person user1614862    schedule 16.09.2019    source источник


Ответы (1)


Вы можете использовать this(context.getProperty("api.ut.HTTP_METHOD")) для получения ресурса метода и this(context.getProperty("api.ut.hostName")) для получения хоста. Таким образом, вы можете реализовать логику в своем обработчике, чтобы проверить хост и ресурс, а затем разрешить запрос.

person Senthuran    schedule 13.10.2019