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.