Authentification et Autorisation avec Zend AMF

Flash, Zend 22 Commentaires »

Nous allons voir comment mettre en place l’authentification et l’autorisation lorsque l’on souhaite travailler avec Zend et le protocole AMF.

Au niveau des pré-requit, vous devez avoir une architecture Zend et AMF opérationnelle.
Aussi, je vous conseils de lire la documentation sur Zend_Auth et Zend_Acl.
Vous devez avoir compris la notion de rôle et de ressource.

Objectifs

Si vous fournissez des services à travers le réseau, et qu’ils peuvent avoir un impact sur la cohérence des données, vous vous devez de sécuriser l’accès à ces services.

Sécurisé l’accès signifie restreinte l’accès, mais aussi chiffrer les communications.
Nous ne traiterons pas la partie chiffrement des échanges, pour cela je vous laissez chercher de la documentation sur HTTPS.

Point de départ

Ci-dessous, un exemple de contrôleur Zend offrant des services AMF.

class ServiceController extends Zend_Controller_Action
{
    public function init()
    {
        $this->_helper->viewRenderer->setNoRender();
        $this->_helper->layout->disableLayout();
    }
 
    public function amfAction()
    {
	$server = new Zend_Amf_Server();
 
	//Liste des services
	$server->setClass( "Service_User" );
	$server->setClass( "Service_Book" );
	$server->setClass( "ZendAmfServiceBrowser" );
 
	//Mapping des objets PHP avec les objets ActionScript		
	$server->setClassMap('UserDTO', 'Model_DTO_User');
	$server->setClassMap('BookDTO', 'Model_DTO_Book');
 
	$server->setProduction(false);
 
	ZendAmfServiceBrowser::$ZEND_AMF_SERVER = $server;
 
	echo ($server->handle());
    }
}

Nous avons donc deux services, et deux types d’objets pouvant être utilisés.

Vous remarquerez l’utilisation de ZamfBrowser, ce service couplé avec une application Adobe AIR permet de travailler facilement avec les services.

Voici à quoi ressemble les prototypes d’un de mes services.

class Service_Book
{
	public function createBook (Model_DTO_Book $oBook) {}
	public function readBook (Model_DTO_Book $oBook) {}
	public function updateBook (Model_DTO_Book $oBook) {}
	public function deleteBook (Model_DTO_Book $oBook) {}
	public function isRentBy (Model_DTO_User $oUser) {}
}

L’autre service est composé lui aussi des méthodes CRUD (Create, Read, Update, Delete), ainsi que d’autres fonctions métiers.

Sachant que mon application cliente Flash utilise ces services, il est très facile à un utilisateur de découvrir l’URI de la passerelle AMF.
En l’état, une personne ayant l’accès à ma passerelle AMF pourrai utiliser toutes les fonctions de mes services. Ce qui implique qu’il puisse modifier ma base de données.

Remarquer que si l’on supprime le service de ZamfBrowser, l’utilisateur n’aura pas accès à la liste exhaustive des services. Si vous êtes en production, je vous conseils donc de supprimer ce service pour des raisons de sécurité.

Mise en place de l’authentification

Nous allons commencer par mettre en place l’authentification,
Sachant que nous utilisons un client Flash, il est logique d’utiliser Zend_Amf_Adobe_Auth.

$authAdapter = new Zend_Amf_Adobe_Auth(APPLICATION_PATH . '/config/password.xml');
$server->setAuth($authAdapter );

Avec ces deux lignes, nous avons mis en place l’authentification au niveau du serveur.
Il vous reste à définir le fichier password.xml

<?xml version="1.0"?>
<roles>
   <role id="editor">
        <user name="stephane" password="P@ssword01"/>
        <user name="robert" password="P@ssword01"/>
   </role>
</roles>

Le fichier password.xml contient les identifiants et les mots de passe des utilisateurs.
C’est à ce niveau que vous définissez les affectations d’identifiants à un rôle.

Si vous avez besoin de plus de souplesse au niveau de la gestion des identifiants, je vous conseils la lecture de Authentification avec une table de base de données.

Il est à noter, que si vous ne spécifier aucun identifiant lors de votre connexion au serveur AMF vous serez considéré comme un invité : Zend_Amf_Constants::GUEST_ROLE

Mise en place de l’autorisation

Maintenant que nous avons correctement définit l’authentification, passons à l’autorisation.
C’est maintenant que nous allons donner les autorisations ou refus d’accès aux services.

$acl = new Zend_Acl();
$server->setAcl($acl);

Avec ces deux lignes, vous avez définit une Acces Control List.
Vous le constatez, aucune autorisation n’est définit; mais il est important de noter que maintenant, plus personne n’a accès à vos services.

Pour donner l’accès à nos deux services à n’importe qui, nous allons procéder comme suit :

$acl = new Zend_Acl();
$acl->addResource ( new Zend_Acl_Resource('Service_User') );
$acl->addResource ( new Zend_Acl_Resource('Service_Book') );
$acl->addResource ( new Zend_Acl_Resource('ZendAmfServiceBrowser') );
 
$acl->allow (null, 'Service_User');
$acl->allow (null, 'Service_Book');
$acl->allow (null, 'ZendAmfServiceBrowser);
$server->setAcl($acl);

Ci-dessus, nous avons une liste explicite des autorisations.
Si nous avions voulu faire dans l’implicite, nous aurions procédé ainsi :

$acl = new Zend_Acl();
$acl->allow ();
$server->setAcl($acl);

Pour aller plus loin dans l’explication, nous allons maintenant définir l’ensemble de nos autorisations.

Nous souhaitons que le rôle administrateur est accès à tout, et nous souhaitons que les utilisateurs non authentifiés n’est pas accès aux fonctions de mise à jour.

Rappelez-vous, nous avons vu plus haut que vous étiez connecter avec le rôle invité lorsque vous ne spécifiez aucun identifiant.

$acl = new Zend_Acl();
 
//Définition les rôles.
$acl->addRole ( new Zend_Acl_Role(Zend_Amf_Constants::GUEST_ROLE) );
 
//Définition des autorisations
$acl->allow ();
$acl->deny (Zend_Amf_Constants::GUEST_ROLE, null, "create");
$acl->deny (Zend_Amf_Constants::GUEST_ROLE, null, "update");
$acl->deny (Zend_Amf_Constants::GUEST_ROLE, null, "delete");
 
$server->setAcl($acl);

Premièrement,
Nous avons dû définir le rôle invité pour pouvoir travailler ses autorisations.

Deuxièmement,
Nous avons utilisé le principe des listes noires. Si nous avions utilisez un système de liste blanche, nous aurions du définir l’ensemble des rôles, et l’ensemble des autorisations.
C’est donc en partant du principe que tout le monde a accès à tout, que nous avons fermé les portes aux anonymes.

Explication des fonctions Deny & Allow :
Zend_Acl::deny et Zend_Acl::allow utilisent les mêmes arguments.
Le premier paramètre correspond à un rôle, cela ne change pas des ACL Zend classique.
Le deuxième paramètre correspond à une ressource. Avec Zend AMF, une ressource correspond à un Service.
Le troisième paramètre correspond ici à la fonction d’un service AMF.

Nous avons utiliser null au niveau du deuxième paramètre pour dire : tout les services.

initAcl

Ce dernier paragraphe pour vous parlez de mon opposition face aux spécifications de la documentation Zend_AMF_Server :

If the ACL object is set, and the class being called defines initAcl() method, this method will be called with the ACL object as an argument. The class then can create additional ACL rules and return TRUE, or return FALSE if no access control is required for this class.

En gros, il existe une autre manière de définir les autorisations,
Si vous avez définit un ACL au niveau de votre Serveur AMF. Ce dernier vérifiera l’existence d’une fonction initAcl sur les services lorsqu’ils seront appelés.

Cette fonction est ce que l’on appel un Hook, et vous permets de définir les autorisations et refus au sein de la définition même de vos services.
Autant vous dire que niveau maintenance et centralisation de l’information c’est très moyen..
De plus, si l’on pend l’exemple de ZendAmfServiceBrowser, vous allez devoir modifier la définition de ce service, et cela à chaque fois qu’il y aura une nouvelle version ?

Voici un exemple de fonctionnement

class Service_Book
{
	public function initAcl ($acl)
	{
		$acl->deny('editor', 'Services_Book', 'create');
		$acl->deny('editor', 'Services_Book', 'update');
		$acl->deny('editor', 'Services_Book', 'delete');
		return true;
	}
}

Pour aller plus loin : Vous trouverez un article dédié à l’authentification pour Zend AMF Server avec une base de données : AMF / Zend Authentication using Database

Mots-clefs :, , , , , , ,
 

Flash – Restreindre l’instanciation d’une classe par un seul objet

AIR, Flash, Flex 4 Commentaires »

Comment restreindre l’instanciation d’une classe à une autre classe.

Voici une idée complètement « crazy » au quelle je vais apporter une solution à travers ce billet.
Nous allons utiliser un principe connu par de nombreux framework Web qui permet d’assurer la validité d’un formulaire: Le jeton !

L’intérêt étant de combiner cela avec le pattern Factory.

public class Master
{
	private static var _jeton	: Number	= -1;
 
	public function Master()
	{
	}
 
	public static function createSlave () : Slave
	{
		var _tmpSlave	: Slave;
 
		_jeton		= Math.random() * 500;
		_tmpSlave	= new Slave (_jeton);
		_jeton		= -1;
 
		return _tmpSlave;			
	}
 
	public static function get jeton () : Number
	{
		return _jeton;
	}
}
public class Slave
{
	public function Slave(_pJeton : Number = 0) : void
	{
		if (Master.jeton !== _pJeton && Master.jeton !== -1)
			throw new Error ("Instanciation obligatoire par Master.createSlave");
	}
}
new Slave (); //throw Error
Master.createSlave (); //Retourne un objet du type Slave
Mots-clefs :, , , , ,
 

Configuration ASDoc FlexBuilder

Flex 2 Commentaires »

Même si FlashBuilder pointe le bout de son nez, comme que je suis toujours en retard voici un petit mémo pour configurer ASDoc sous FlexBuilder.

Sous Eclipse / FlexBuilder: Run > External Tools > Open External Tools Dialog…

  • Location: %programfiles%\Adobe\Flex Builder 3\sdks\3.3\bin\asdoc.exe
  • Working Directory: ${project_loc}
  • Arguments: -source-path ./src/ -window-title « ${project_name} » -main-title « ${project_name} » -doc-sources « ${project_loc}/src/ »

Par défaut, la documentation sera dans votre répertoire projet /asdoc-output

Aussi, si vous utilisez des librairies qui se croisent pour vos projets, il faudra indiquer à ASDoc où trouver les SWC correspondants. Pour cela -library-path fera l’affaire.
Pour conserver un lien vers les autres librairies dont Flex, utiliser l’argument comme suit : -library-path+= »${workspace_loc}/Project/bin/ »

PS: Pour le répertoire de ASDoc.exe pensez à utiliser votre version du SDK de Flex, car vous disposez peut-être d’une version différente de la mienne.

Mots-clefs :, , , , , ,
 

Serious Drink Lyonnais

Sortie Aucun commentaire »

Si vous avez envie de passer une petite soirée à boire des bières et parler des technologies Flex ou Elearning n’hésiter pas à vous inscrire sur le site de la Fabrick en laissant un petit commentaire ;)

Rendez-vous Jeudi 23 Avril 2009, à partir de 19h30 au café Cousu.
Passage Thiaffait
19,rue René Leynaud
69001 Lyon
Tel: 04 72 98 83 38

PS : Les bières ne sont pas obligatoires, on peut aussi boire un coca ou un lait fraise sans soucis ;)


Agrandir le plan

Mots-clefs :, , , ,
 

Adobe Captivate 4 Disponible

Elearning 3 Commentaires »

CaptivateLégèrement médiatisé, Adobe a sorti une nouvelle version de son logiciel de rapide learning : Captivate 4.

Vous créez rapidement du contenu e-learning professionnel [...] sans posséder de compétences particulières en programmation ou en multimédia. [...] Vous pouvez diffuser massivement vos contenus via des systèmes LMS.

Les nouveautés au programme :

  • Annotation de fichiers SWF
  • Modèles de projet professionnels
  • Widgets personnalisables
  • Flux de production PowerPoint circulaire
  • Table des matières et agrégateur
  • Fonctions de synthèse vocale
  • Variables et actions avancées
  • Options de sortie étendues
  • Prise en charge des calques Adobe Photoshop
  • Flux de production simplifiés et ergonomie optimisée

Et maintenant, l’exportation SWF se fait en AS3 avec l’AVM2.
Rappelez-vous lorsque vous vouliez importer votre animation Captivate dans une interface Flash développé en AS3, il fallait utiliser un bridge pour faire communiquer les deux.

Avec cette nouvelle exportation, il va être possible d’importer du Captivate dans des projets Flex pour enrichir vos présentations.

Avez-vous des retours d’expériences sur cette version 4 ?

Mots-clefs :, , , ,
 

The link of the week – 04

Armetiz 2 Commentaires »

Voici le résumer des liens de ma semaine.

  • Manager une communauté : « Comment créer une communauté, la développer, l’animer, la monétiser… Autant de thèmes, et bien d’autres, qui animeront ce blog qui s’adresse aux community managers, animateurs, modérateurs, gestionnaires de forums et à tous les spécialistes du web marketing.« 
  • Jouer avec le protocole ARP est un Wiki expliquant le protocole ARP, et se que l’on peut faire avec : Man In the Middle sur un réseau local.
  • Introduction à l’écriture de plugin WordPress
  • Externalisez vos commentaires avec Disqus.
  • Flex :
    • Un très bon didacticiel sur l’utilisation de PureMVC accompagné tout du long par un cas pratique.
    • FCG : Générateur de code pour CairnGorm ou PureMVC.
    • Utilisation de l’API SQLite de AIR, génération de donnée persistante sans requête SQL.

Sur ce, je vous souhaites un bon weekend à tous, et une bonne fin de journée ;)

Mots-clefs :, , , , , , , , ,
 

Attirer des visiteurs sur un site éditorial grâce à un jeu

Flex, Web Aucun commentaire »

circuit électriqueLes membres de l’équipe de MagicSocket ont développés leur site éditorial en intégrant un jeu assez prenant.

L’idée du jeu est simple : représentation d’un circuit de voiture électrique, avec une compétition possible entre fantôme.

L’intégration du circuit par rapport au contenu éditorial n’a pas été faite de manière classique, le jeu n’est pas dans une cellule d’un coin de la page, mais tout autours du site et entre les différents articles.

Je trouve que l’idée est très bonne pour générer du trafic.
Alors attention, le type de trafic sera surement composé majoritairement de joueur qui n’auront rien à faire du contenu éditorial.
Mais pour une agence de communication / développement, quoi de mieux d’avoir se type d’interface qui fera parler d’elle.

Par contre, nous retrouvons les inconvénients d’un site full flash : lourdeur au niveau du chargement et de l’utilisation, et référencement naturel inexistant.

Mots-clefs :, , , , , ,
 

Reflex : Architecture MVC

Flex 7 Commentaires »

Fabien de la Fabrick a publié une « micro-architecture » MVC pour Flex.
Ces mots de présentation sont :

Souvent dans le monde de Flex, les équipes ne sont pas forcement homogènes. Certains sont habitués à la rigueur de Java, d’autres sont plus “devsigners freestyle” venant du monde Flash. Les premiers aiment les grosses mécaniques comme PureMVC, ou Prana Framework “Spring like”. Les seconds connaissent au mieux Cairngorm, au pire confondent MVC et VMC – ce qui n’a rien a voir, sauf si vous faites une application riche sur le thème de la ventilation.

Pour l’instant deux didacticiels sont disponibles : Introduction et Exemple et l’utilisation de l’IOC où il faut comprendre « Injection Of Content » plutôt que « Inversion Of Control« .

Ceci est un article orienté publicité d’une part, mais aussi « déploiement ». Toute personne recherchant un framework MVC tombera sur PureMVC ou Cairngorm, et bien maintenant, il y aura aussi ReFlex qui entrera dans la liste.

Si vous utilisez ReFlex, n’hésitez pas à faire des retours à l’auteur.

Edit : Oubli de ma part, gros framework incluant le pattern MVC : Vegas développé par eKameleon. D’ailleurs Vega n’inclue pas uniquement le pattern MVC, mais aussi beaucoup d’autres choses, il peut avoir l’air très difficile à appréhender. Mais comme toute nouvelle découverte, cela demande de l’investissement. Mais rassurez-vous, c’est un framework très riche en documentation.

A vous de faire votre choix ;)

Mots-clefs :, , , , , , , , ,
 

The link of the week – 02

Armetiz 1 Commentaire »

Autre édition du fameux link of the week.

Je vous souhaite à tous un bon weekend ;)

Mots-clefs :, , , , , , , , ,
 

Apprendre Flex – Vidéo de formation Adobe

Elearning, Flex Aucun commentaire »

Cela fait quelques semaines déjà que des vidéos de formation Flex sont proposées par Adobe, mais cela ne fait que quelques jours qu’elles sont toutes disponibles.

5 Jours pour être autonome sur Flex

C’est le slogan utilisé par Adobe pour introduire ces tutoriels entrelacés d’exercices.
Voici le programme :

  • Day 1: Flex basics – Les bases de Flex
  • Day 2: Component development – Développement de composant
  • Day 3: Putting it all together – Mixer l’ensemble
  • Day 4: Adding visual appeal – Améliorer l’aspect graphique
  • Day 5: Architecture and advanced topics – Architecture et sujet avancé

Une journée est composée d’une petite dizaine de vidéo durant 8 min en moyenne.
Il faut donc prendre une heure de son temps pour faire un module.

Les vidéos sont très bien réalisée, l’anglais y est parfaitement compréhensible avec les sous-titres inclus.

Aussi, l’illustration de notion élémentaire comme la gestion des événements est très formatrice et permet d’avoir un autre point de vue que celui fournit par les livres.

Dans le même principe que la découverte de la POO avec Flash, prenez votre temps pour découvrir les vidéos et n’hésitez pas à revenir en arrière lorsqu’une notion n’est pas comprise.
La vertu du Elearning, c’est de pouvoir recommencer autant de fois que l’on souhaite notre formation, abusez de cela.

Adobe propose même la visualisation hors-ligne des vidéos.

PS : Si quelqu’un souhaite modifier mes traductions, qu’il le fasse maintenant ou se taise à jamais ;)

Liens utiles :

Edit du 25 Novembre 08 :
Pour faire le tour des composants et possibilités de Flex, vous pouvez installer Tour de Flex qui est une application AIR regroupant une très grande quantité de composant avec les codes sources associés.
C’est vraiment un must have quand on apprend ou même utilise Flex, car vous avez la dedans une grosse bibliothèque d’exemple fonctionnel.

Mots-clefs :, , , , ,
 
Designed by NattyWP Wordpress Themes.
Images by desEXign.