2016-07-19 132 views
7

Ho già dato un'occhiata a questo problema: https://github.com/symfony/symfony/issues/3691Symfony2 - Ruolo di sicurezza - da PHP 5.3 a PHP> 5.4 - getRole() su un non-oggetto

Il mio problema è che non riesco a trovare una soluzione a fallo funzionare.

Io uso Symfony 2.8.3

Qui è l'errore che ho avuto:

FatalErrorException in RoleHierarchy.php line 43: Error: Call to a member function getRole() on a non-object 

ho serializzato tutto correttamente, qui sono le mie classi:

utente

<?php 
/** 
*/ 

namespace CNAMTS\PHPK\SecurityBundle\Security\User; 

use Symfony\Component\Security\Core\User\UserInterface; 
use CNAMTS\PHPK\SecurityBundle\Security\Role; 

/** 
* Classe abstraite implémentant la classe Symfony UserInterface. 
*/ 
abstract class User implements UserInterface 
{ 
    public function __construct() { 
     $this->roles = array(); 
    } 

    /** 
    * Concaténation du nom et du numéro d'agent : NOM-NUMERO. 
    * 
    * @var String 
    */ 
    protected $ismum; 
    /** 
    * Nom de l'utilisateur. 
    * 
    * @var String 
    */ 
    protected $nom; 
    /** 
    * Prénom de l'utilisateur. 
    * 
    * @var String 
    */ 
    protected $prenom; 
    /** 
    * Id de l'utilisateur. 
    * 
    * @var String 
    */ 
    protected $id; 
    /** 
    * Numéro d'agent. 
    * 
    * @var String 
    */ 
    protected $chrono; 
    /** 
    * Code de l'organisme 
    * 
    * @var String 
    */ 
    protected $codeOrganisme; 
    /** 
    * Numéro Siret de l'organisme. 
    * 
    * @var String 
    */ 
    protected $siret; 
    /** 
    * Services AccessMaster de l'utilisateur. 
    * 
    * @var array(Symfony\Component\Security\Core\Role\Role) 
    */ 
    protected $roles; 
    /** 
    * Système de l'utilisateur. 
    * 
    * @var String 
    */ 
    protected $systeme; 

    /** 
    * Défini l'Ismum (Concaténation du nom et du numéro d'agent : NOM-NUMERO). 
    * 
    * @param String $ismum 
    */ 
    public function setIsmum($ismum) 
    { 
     $this->ismum = $ismum; 
    } 
    /** 
    * Retourne l'Ismum (Concaténation du nom et du numéro d'agent : NOM-NUMERO). 
    * 
    * @return String 
    */ 
    public function getIsmum() 
    { 
     return $this->ismum; 
    } 
    /** 
    * Défini le nom de l'utilisateur. 
    * 
    * @param String $nom 
    */ 
    public function setNom($nom) 
    { 
     $this->nom = $nom; 
    } 
    /** 
    * Retourne le nom de l'utilisateur. 
    * 
    * @return String 
    */ 
    public function getNom() 
    { 
     return $this->nom; 
    } 
    /** 
    * Défini le prénom de l'utilisateur. 
    * 
    * @param String $prenom 
    */ 
    public function setPrenom($prenom) 
    { 
     $this->prenom = $prenom; 
    } 
    /** 
    * Retourne le nom de l'utilisateur. 
    * 
    * @return String 
    */ 
    public function getPrenom() 
    { 
     return $this->prenom; 
    } 
    /** 
    * Défini l'id de l'utilisateur. 
    * 
    * @param String $id 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 
    } 
    /** 
    * Retourne l'id de l'utilisateur. 
    * 
    * @return String 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
    /** 
    * Défini le numéro d'agent. 
    * 
    * @param String $chrono 
    */ 
    public function setChrono($chrono) 
    { 
     $this->chrono = $chrono; 
    } 
    /** 
    * Retourne le numéro d'agent. 
    * 
    * @return String 
    */ 
    public function getChrono() 
    { 
     return $this->chrono; 
    } 
    /** 
    * Défini le code organisme 
    * @param String $codeOrganisme 
    */ 
    public function setCodeOrganisme($codeOrganisme) 
    { 
     $this->codeOrganisme = $codeOrganisme; 
    } 
    /** 
    * Retourne le code organisme 
    * @return String 
    */ 
    public function getCodeOrganisme() 
    { 
     return $this->codeOrganisme; 
    } 
    /** 
    * Défini le SIRET de l'utilisateur. 
    * 
    * @param String $siret 
    */ 
    public function setSiret($siret) 
    { 
     $this->siret = $siret; 
    } 
    /** 
    * Retourne le SIRET de l'utilisateur. 
    * 
    * @return String 
    */ 
    public function getSiret() 
    { 
     return $this->siret; 
    } 

    /** 
    * Ajoute un service AccessMaster à l'utilisateur. 
    * 
    * @param String $role 
    */ 
    public function addRole(Role $role) 
    { 
     $this->roles[] = $role; 
    } 
    /** 
    * Retourne les services AccessMaster de l'utilisateur. 
    * 
    * @return array(CNAMTS\PHPK\SecurityBundle\Security\Role) 
    */ 
    public function getRoles() 
    { 
     return $this->roles; 
    } 

    /** 
    * Défini le système de l'utilisateur. 
    * 
    * @param String $systeme 
    */ 
    public function setSysteme($systeme) 
    { 
     $this->systeme = $systeme; 
    } 
    /** 
    * Retourne le système de l'utilisateur. 
    * 
    * @return String 
    */ 
    public function getSysteme() 
    { 
     return $this->systeme; 
    } 

    /** 
    * @ignore 
    */ 
    public function eraseCredentials() 
    { 
    } 

    /** 
    * Permet de tester si deux instances de UserInterface sont égales. 
    * 
    * @param UserInterface $user 
    * 
    * @return boolean 
    */ 
    public function equals(UserInterface $user) 
    { 
     if (!$user instanceof User) { 
      return false; 
     } 

     if ($this->username !== $user->getUsername()) { 
      return false; 
     } 
     if ($this->organisme !== $user->getOrganisme()) { 
      return false; 
     } 
     if ($this->jeton !== $user->getJeton()) { 
      return false; 
     } 

     return true; 
    } 

    /** 
    * Retourne true si l'utilisateur possède le service passé en paramètre 
    * Prend en paramètre une chaîne ou un tableau de chaînes. 
    * 
    * @param mixed $role 
    * 
    * @return boolean 
    */ 
    public function isGranted($role) 
    { 
     if (is_array($role)) { 
      foreach ($role as $r) { 
       foreach ($this->getRoles() as $own) { 
        if ($own->getRole() === $r) { 
         return true; 
        } 
       } 
      } 
     } elseif (is_string($role)) { 
      foreach ($this->getRoles() as $own) { 
       if ($own->getRole() === $role) { 
        return true; 
       } 
      } 
     } 

     return false; 
    } 

    /** 
    * @ignore 
    */ 
    public function getUsername() 
    { 
     return $this->getIsmum(); 
    } 
    /** 
    * @ignore 
    */ 
    public function getPassword() 
    { 
     return; 
    } 
    /** 
    * @ignore 
    */ 
    public function getSalt() 
    { 
     return; 
    } 
} 

Implementazione di questo utente astratto

<?php 
namespace CNAMTS\PHPK\SecurityBundle\Security\User; 

/** 
* Classe décrivant un User lorsque le mode AccessMaster pour la sécurité est activé. 
*/ 
class AccessMasterUser extends User implements \Serializable 
{ 
    public function serialize() 
    { 
     return \json_encode(array(
      $this->civilite, 
      $this->chrono, 
      $this->codeOrganisme, 
      $this->id, 
      $this->ismum, 
      $this->nom, 
      $this->prenom, 
      serialize($this->roles), 
      $this->siret, 
      $this->systeme 
     )); 
    } 
    public function unserialize($serialized) 
    { 
     list(
      $this->civilite, 
      $this->chrono, 
      $this->codeOrganisme, 
      $this->id, 
      $this->ismum, 
      $this->nom, 
      $this->prenom, 
      $roles, 
      $this->siret, 
      $this->systeme 
     ) = \json_decode($serialized); 

     $this->roles = unserialize($roles); 
    } 

    /** 
    * Civilité de l'utilisateur. 
    * 
    * @var String 
    */ 
    private $civilite; 

    /** 
    * Défini la civilité de l'utilisateur. 
    * 
    * @param String $civilite 
    */ 
    public function setCivilite($civilite) 
    { 
     $this->civilite = $civilite; 
    } 
    /** 
    * Retourne la civilité de l'utilisateur. 
    * 
    * @return String 
    */ 
    public function getCivilite() 
    { 
     return $this->civilite; 
    } 
} 

Ruolo

<?php 
namespace CNAMTS\PHPK\SecurityBundle\Security; 

use Symfony\Component\Security\Core\Role\RoleInterface; 

class Role implements RoleInterface, \Serializable 
{ 
    private $role; 
    private $attributes; 

    public function serialize() { 
     return \json_encode(array(
      $this->role, 
      $this->attributes 
     )); 
    } 

    public function unserialize($serialized) { 
     list(
      $this->role, 
      $this->attributes 
     ) = \json_decode($serialized); 
    } 

    /** 
    * Constructor. 
    * 
    * @param string $role The role name 
    */ 
    public function __construct($role, $attributes = array()) 
    { 
     $this->role = (string) $role; 
     $this->attributes = $attributes; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getRole() 
    { 
     return $this->role; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getAttributes() 
    { 
     return $this->attributes; 
    } 
} 

Subito dopo il login, tutti i ruoli sono ok, users.roles e ruoli sono esattamente gli stessi:

First page

Ma quando vado a un'altra pagina, ho ottenuto questo:

Second page

Cosa c'è di sbagliato nel mio codice? Perché funziona su PHP 5.3.3, ma non funziona su PHP 5.4.40 o PHP 5.5.28?

Grazie in anticipo, sono completamente bloccato.

+0

Hai cancellato i dati della sessione dopo l'aggiornamento di php? – Cerad

+0

Non è sullo stesso server, funziona sul mio server PHP 5.3.3, ma non sugli altri due (5.4.40 e 5.5.28). Quindi presumo che la sessione sia stata cancellata. - Ok ho appena eliminato tutto, e il problema è ancora lì: - / – Ulti

risposta

3

Penso che la risposta al vostro problema è in quel bug legato, come sottolinea utente GitHub Sharom fuori here e here.

Quindi sembra che il problema è che stai includendo User::$roles nella serializzazione/unserializzazione della classe User quando non è necessario.

P.S. Penso anche che sia strano e probabilmente inappropriato che tu stia usando json _ *() come meccanismo dietro l'interfaccia Serializable.

Problemi correlati