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.
