Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 02-04-2008 09:56:43

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

[SOAP][1.5]Comment sécuriser l'acces aux services en utlisant Zend_Acl

Bonjour,

J'ai un petit problème :
Je maitrise bien Zend_Acl en dehors de l'utilisation de services soap, tout marche parfaitement.
Hors lorsque je fais appel à un service depuis mon client je ne parviens pas à interdire l'acces au service.

Explication (petit exemple simple):

Code:

<?php
class webService_IndexController extends Zend_Controller_Action {

    function indexAction(){    
            
        //Chargement de la classe des services 
        Zend_Loader::loadClass('MaClasseDeServiceWebController');
        
        //Désactivation des vues (pas d'envoi d'entêtes http!)
        $this->_helper->viewRenderer->setNoRender(true);

        $uri = "http://sep181/soap/conf/monwsdl.wsdl";
        
        try {
            $soap = new SoapServer($uri,array('trace' => 1, 'soap_version'=>SOAP_1_2));                
            $soap->setClass('MaClasseDeServiceWebController');
            $soap->handle();
        }catch(Exception $e){
            var_dump($e->getMessage());
        }
    }
}

Ma classe de service Saop :

Code:

<?php

class MaClasseDeServiceWebController{

    public function getAlbumByIdAction($id){        
        
        $acl = Zend_Registry::get("ACL");

        if($acl->isAllowed('visiteur', 'MaClasseDeServiceWeb','getAlbumById' ))
        {
            $handle = fopen('C:\dev\php\workspace\soap\log.txt',"a+");
            fwrite ($handle,"Acces interdit");
            fclose($handle);
        }

        Zend_Loader::loadClass('Album');
        $album = new Album();
        
        return $album->fetchRow('id='.$id)->artist;        
    }
}

Mon fichier contenant les acl :

Code:

<?php
class MyAcl extends Zend_Acl
{
    public function __construct()
    {
        //parent::__construct();

        $this->add(new Zend_Acl_Resource('index')); //webService_IndexController
    $this->add(new Zend_Acl_Resource('MaClasseDeServiceWeb')); //MaClasseDeServiceWebController

        
        $this->addRole(new Zend_Acl_Role('visiteur')); 

        // Les invités peuvent uniquement voir le contenu
        $this->deny('visiteur', 'MaClasseDeServiceWeb', 'getAlbumById');     
        $this->allow('visiteur', 'index');
   }
}

Donc normalement d'apres mes acl, l'invité (role défini en dur pour l'instant) ne devrait pas pouvoir avoir acces à l'action getAlbumById, hors lorsque je fais appel au service celui ci répond normalement.
Si je fais (dans mon action getAlbumById):

Code:

if($acl->isAllowed('visiteur', 'MaClasseDeServiceWeb','getAlbumById' ))
        {
            $handle = fopen('C:\dev\php\workspace\soap\log.txt',"a+");
            fwrite ($handle,"Acces interdit");
            fclose($handle);
        }

J'ai bien "acces interdit" d'écrit dans mon fichier, j'ai l'impression que l'appel de service, n'est pas du tout traité de la même façon que le simple appel d'une action sur un page toute simple (ou la j'aurai été bloqué).

Je voulais donc savoir si vous connaissiez une astuce permettant d'utiliser Zend_auth conjointement avec un server soap. Parceque si je dois mettre $acl->isAllowed('visiteur',$moncontrolleur,$mon_action ) dans toutes mes actions de service, cela revient à ne pas utiliser Zend_auth et tout traiter à la main.

J'aurai voulu pouvoir utiliser Zend_auth et faire en renvoi d'une réponse contenant un message d'erreur à chaque appel de service ou l'on a aucune accréditation !

Merci d'avance.

Seb

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages