Bonjour,

J'ai réalisé une petite application pour me faire la main sur symfony après avoir lu "Practical symfony" et je bloque depuis un moment sur le problème suivant.

Après avoir travaillé sur les fonctionnalités, j'ai intégré la gestion des utilisateurs, l'authentification et la gestion des droits avec le plugin sfDoctrineGuardPlugin (V1.0.4). Jusque là tout va bien.

Mais j'ai besoin d'utiliser un CAS pour gérer l'authentification. J'ai récupéré sur le web une classe qui permet cette authentification (https://wiki.jasig.org/display/CASC/Symfony+CAS+Client). Depuis, je peux toujours m'authentifier et accéder à l'application mais plus aucun de mes formulaires ne fonctionne : "csrf token: CSRF attack detected."

J'ai donc comparé mes formulaires selon que je m'authentifie avec le plugin Symfony ou par le CAS.

Dans les 2 cas le jeton _csrf_token est présent. Seule différence remarquée...
Avec le CAS, mon jeton est toujours différent d'un formulaire à un autre.
Sans le CAS, mon jeton est toujours le même.

Le problème vient sans doute de là mais je ne connais pas bien le fonctionnement de la protection CSRF et je ne sais pas comment corriger ce problème.

J'espère que vous pourrez m'aiguiller pour corriger ce problème

Merci


Le code de la classe d'authentification par le CAS.
/lib/sfCASRequiredFilter.class.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
class sfCASRequiredFilter extends sfBasicSecurityFilter
{
 
 
  public function execute ($filterChain)
  {
  	if ( $this->isFirstCall() || !$this->getContext()->getUser()->isAuthenticated() ) {
 
        phpCAS::client(CAS_VERSION_2_0,$this->getParameter('server_domain'), $this->getParameter('server_port'), $this->getParameter('server_path'));
 
        phpCAS::forceAuthentication();
 
        $user_ldap = phpCAS::getUser();
 
		// Témoin d'authentification de symfony ! 
		//$this->getContext()->getUser()->signInWithCas($user_ldap);
        $this->getContext()->getUser()->setAuthenticated(true);
 
        // Recherche si l'utilisateur authentifié est bien dans la base de données !
        $userTable = Doctrine_Core::getTable('SfGuardUser');
  		$user = $userTable->findOneByUsername($user_ldap);
  		// fait le lien entre l'utilisateur authentifié et ces données dans la base de l'application
        $this->context->getUser()->signIn($user); 
 
        $this->getContext()->getUser()->setAttribute('username', $user_ldap, 'cas');
        $this->getContext()->getUser()->addCredential('username_'.$user_ldap);
       	$this->getContext()->getUser()->setAttribute('username_cas', $user_ldap);
 
    }
 
    # if not initially authorized, sfBasicSecurityFilter sets $controller->forward(sfConfig::get('sf_login_module'), sfConfig::get('sf_login_action'));
    # so we re-dispatch since we are already authorized
    # copied from sfFrontWebController's dispatch()
    $this->getContext()->getLogger()->debug('{sfCASRequiredFilter} configs are ' . sfConfig::get('sf_login_module') . '/' . sfConfig::get('sf_login_action'));
    if ($this->getContext()->getModuleName() == sfConfig::get('sf_login_module')
            && $this->getContext()->getActionName() == sfConfig::get('sf_login_action')) {
 
        $request    = $this->getContext()->getRequest();
        $moduleName = $request->getParameter('module');
        $actionName = $request->getParameter('action');
 
        $this->getContext()->getLogger()->debug('{sfCASRequiredFilter} forwarding to ' . $moduleName . '/' . $actionName);
        $this->getContext()->getController()->forward($moduleName, $actionName);
    }
 
    // Execute next filter in the chain
    $filterChain->execute();
  }
}
Configuration du CAS dans le fichier filters.yml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
rendering: ~
 
cas_required:
  enabled: %SF_CAS_REQUIRED% 
  class: sfCASRequiredFilter
  param:
    server_domain: le.domaine
    server_port: le.port
    server_path: le.path
 
security:  ~
 
# insert your own filters here
 
cache:     ~
execution: ~
((%SF_CAS_REQUIRED% est définit dans le settings.yml.))