symfony - Symfony2 - Security Role - From PHP 5.3 to PHP >5.4 - getRole() on a non-object -
i had @ issue : https://github.com/symfony/symfony/issues/3691
my problem can't find solution make work.
i use symfony 2.8.3
here error had :
fatalerrorexception in rolehierarchy.php line 43: error: call member function getrole() on non-object
i serialized properly, here classes :
user
<?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 $r) { foreach ($this->getroles() $own) { if ($own->getrole() === $r) { return true; } } } } elseif (is_string($role)) { foreach ($this->getroles() $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; } }
implementation of abstract user
<?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; } }
role
<?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 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; } }
just after login, roles ok, users.roles , roles same :
but when go page, got :
what wrong in code ? why working on php 5.3.3, doesn't work on php 5.4.40 or php 5.5.28 ?
thanks in advance, i'm totally blocked.
i think answer problem is in linked bug, github user sharom points out here , here.
so seems problem you're including user::$roles
serialization/unserialization of user
class when don't have to.
p.s. think it's weird , improper you're using json_*() mechanism behind serializable interface.
Comments
Post a Comment