When I was verifying the operation with Symfony4, when I entered the ID and password, the same login page was displayed.
It seems that I haven’t passed the information necessary for making it behaviorally serious, but I don’t know how to fix it.
Putting $this->salt
in selialize()
didn’t change.
Are there any other problems?
It worked in Symfony 3.4.
https://symfony.com/doc/4.0/security/entity_provider.html
Staff.php
use SymfonyComponentSecurityCoreUserAdvancedUserInterface; use AhiSpCommonBundleModelLibParameters; /** * staffentity * * @ORMEntity(repositoryClass="AhiSpCommonBundleModelRepositoryStaffRepository") * @ORMTable(name="staff", uniqueConstraints={ * @ORMUniqueConstraint(name="idx_staff_unique", columns={"staff_login_id"}), * @ORMUniqueConstraint(name="idx_image_mail_unique", columns={"image_mail"}) * }) * @ORMHasLifecycleCallbacks */ class Staff implements AdvancedUserInterface, Serializable { /** * @ORMId * @ORMColumn(name="id", type="integer", options={"comment"="Staff ID"}) * @ORMGeneratedValue(strategy="AUTO") */ protected $id; /** * password * @ORMColumn(name="password", type="string", length=255, nullable=true, options={"comment"="password"}) */ protected $password; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set raw password. * * @param string $rawPassword */ public function setRawPassword($rawPassword) { $this->rawPassword = $rawPassword; return $this; } /** * Get raw password. * * @return string */ public function getRawPassword() { return $this->rawPassword; } /** * Hash password generation * @ORMPrePersist * @ORMPreUpdate */ public function makeHashPassword() { if ($this->rawPassword) { $encoderFactory = Parameters::getEncoderFactory(); $this->password = $encoderFactory->getEncoder($this)->encodePassword( $this->rawPassword, Parameters::getParameter('staff_password_salt') ); } } /** * Check if the password is correct * @param string $password password * @return boolean True if the password is correct */ public function confirmPassword($rawPassword) { $encoderFactory = Parameters::getEncoderFactory(); $password = $encoderFactory->getEncoder($this)->encodePassword( $rawPassword, Parameters::getParameter('staff_password_salt') ); return ($password === $this->password); } public function getSalt() { return Parameters::getParameter('staff_password_salt'); } public function serialize() { return serialize(array( $this->id, $this->password, )); } public function unserialize($serialized) { list ( $this->id, $this->password, ) = unserialize($serialized); }
Advertisement
Answer
As advised by @Cerad, I implemented EquatableInterface and it works.
https://symfony.com/doc/4.0/security/custom_provider.html
use SymfonyComponentSecurityCoreUserEquatableInterface; use SymfonyComponentSecurityCoreUserUserInterface; class Staff implements AdvancedUserInterface, Serializable, EquatableInterface { /** * @see Serializable::serialize() */ public function serialize() { return serialize(array( $this->id, $this->password, )); } /** * @see Serializable::unserialize() */ public function unserialize($serialized) { list ( $this->id, $this->password, ) = unserialize($serialized, array('allowed_classes' => false)); } public function isEqualTo(UserInterface $user) { if (!$user instanceof Staff) { return false; } if ($this->password !== $user->getPassword()) { return false; } return true; }