Antes de empezar quiero aclarar que no voy a explicar que es AMFPHP ni tampoco voy a profundizar que se puede hacer alguna clase en particular, ya sea de AS3 o PHP.

Para validar si un usuario tiene permisos para acceder a un servicio amf en particular, podemos utilizar el plugin AmfphpAuthentication. Este plugin no hace falta instalarlo, si se descargan AMFPHP2 podrán comenzar a utilizarlo (se puede deshabilitar sino lo van a usar pero por defecto esta activo).

¿Cómo lo utilizo?



Por cada servicio que se requiera estar autentica para su consumo, se deben crear los siguientes métodos:

  • _getMethodRoles Debe devolver el o los roles con los que debe contar para acceder al método que se está quiriendo consumir.
  • login Realiza el proceso de autenticación. No devuelve ningún resultado.


Ejemplo de un servico amf que implementa dichos métodos:

Código PHP :

class TestAuth
{

   /**
    * Devuelve la lista de los roles requeridos para poder llamar a un método determinado.
    *
    * @param string $methodName
    * @return array
    */
   function _getMethodRoles($methodName)
   {
      if($methodName=='test')
      {
         return array('admin');
      }
      
      return null;
   }

   /**
    * Autentica un usuario.
    */
   function login($user,$pass)
   {
      if(session_id () == ""){
         session_start();
      }

      if($user=='admin' && $pass=='admin')
      {
         if(!isset ($_SESSION[AmfphpAuthentication::SESSION_FIELD_ROLES])){
            AmfphpAuthentication::addRole('admin');
         }
      }
      else
      {
         AmfphpAuthentication::clearSessionInfo();
      }
   }

   function test()
   {
      return 'hola!!!';
   }
}


La linea donde se encuentra:

Código PHP :

if(!isset ($_SESSION[AmfphpAuthentication::SESSION_FIELD_ROLES])){
       AmfphpAuthentication::addRole('admin');
}


Añade una variable de sesión el rol que tiene el usuario autenticado. Esto es necesario,ya que el plugin en cuestión, leerá AmfphpAuthentication::SESSION_FIELD_ROLES para verificar que este dentro de la lista de roles obtenidas de la llamada al método _getMethodRoles.

A continuación, les dejo el código correspondiente al cliente (Flex):

Código Flex :

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
            xmlns:s="library://ns.adobe.com/flex/spark"
            xmlns:mx="library://ns.adobe.com/flex/mx"
            minWidth="955"
            minHeight="600">

   <fx:Script>
      <![CDATA[
         import mx.messaging.events.ChannelEvent;
         import mx.rpc.events.FaultEvent;
         import mx.rpc.events.ResultEvent;
         import mx.utils.ObjectUtil;

         private function test():void
         {
            rm.test();
         }

         /**
          * Listener que se llama cuando el server devuelve un error.
          */
         protected function test_faultHandler( e:FaultEvent ):void
         {
            trace( ObjectUtil.toString( e.fault ));
         }
         
         /**
          * Listener que se llama cuando el server a devuelto una respuesta exitosa.
          */
         protected function test_resultHandler( e:ResultEvent ):void
         {
            trace( ObjectUtil.toString( e.result ));
         }
         
         /**
          * Listener que se llama cuando se ha establecido la conexión con el server.
          */
         protected function myCh_channelConnectHandler( e:ChannelEvent ):void
         {
            myCh.netConnection.addHeader( "Credentials",  false,  { 'userid':'admin',  'password':'admin' });
         }
      ]]>
   </fx:Script>

   <fx:Declarations>
      <s:RemoteObject id="rm"
                  destination="TestAmfPhpGateway"
                  source="TestAuth">
         <s:channelSet>
            <s:ChannelSet>
               <s:AMFChannel id="myCh"
                          uri="Amfphp/index.php"
                          channelConnect="myCh_channelConnectHandler(event)"/>
            </s:ChannelSet>
         </s:channelSet>

         <s:method name="test"
                 fault="test_faultHandler(event)"
                 result="test_resultHandler(event)"/>
      </s:RemoteObject>
   </fx:Declarations>
   
   <s:Button x="49"
           y="32"
           label="Probar!"
           click="test();"/>
</s:Application>


Espero que le sirvan y si saben de algúna forma mejor para validar el acceso a un servicio de amf comentenlo por favor.