Безопасность Symfony 2: активация аккаунта - PullRequest
7 голосов
/ 23 января 2012

Я использую систему безопасности Symfony 2.

Когда какой-либо пользователь пытается войти в систему, я хочу дополнительно проверить, является ли поле пользователя "активированным" истинным. В противном случае появляется сообщение об ошибке: «Сначала необходимо активировать учетную запись».

Как я могу реализовать эту функцию?

Ответы [ 3 ]

14 голосов
/ 23 января 2012

Если вы используете Doctrine в качестве поставщика , вы можете реализовать AdvancedUserInterface.Этот интерфейс (определение видно ниже) предоставляет метод isEnabled(), который соответствует методу статуса активации учетной записи.Если этот метод вернет false, у пользователя будет сообщение об ошибке типа Ваша учетная запись не включена при попытке входа в систему.

Я использую его для проверки электронной почты при подписке.

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

/**
 * AdvancedUserInterface adds status flags to a regular account.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface AdvancedUserInterface extends UserInterface
{
    /**
     * Checks whether the user's account has expired.
     *
     * @return Boolean true if the user's account is non expired, false otherwise
     */
    function isAccountNonExpired();

    /**
     * Checks whether the user is locked.
     *
     * @return Boolean true if the user is not locked, false otherwise
     */
    function isAccountNonLocked();

    /**
     * Checks whether the user's credentials (password) has expired.
     *
     * @return Boolean true if the user's credentials are non expired, false otherwise
     */
    function isCredentialsNonExpired();

    /**
     * Checks whether the user is enabled.
     *
     * @return Boolean true if the user is enabled, false otherwise
     */
    function isEnabled();
}
1 голос
/ 23 августа 2014

я попробовал в первый раз.но получил сообщение об ошибке «Пользователь заблокирован», попробуйте выяснить, как реализовать форму AdvanceUserInterface.

Я хочу поделиться кодом, как реализовать это, вот вам:

class User implements AdvancedUserInterface, \Serializable
{
/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(type="string", length=25, unique=true)
 */
private $username;

/**
 * @ORM\Column(type="string", length=255)
 * @Assert\Length(min=8, max=255)
 */
private $password;

/**
 * @ORM\Column(type="string", length=60, unique=true)
 * @Assert\Email(message = "The email '{{ value }}' is not a valid email.", checkMX = true, checkHost = true)
 */
private $email;

/**
 * @ORM\Column(name="is_active", type="boolean")
 */
private $isActive;

/**
 * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
 *
 */
private $roles;

private $salt;


public function __construct()
{
    $this->isActive = true;
    $this->roles = new ArrayCollection();
    // may not be needed, see section on salt below
    // $this->salt = md5(uniqid(null, true));
}

/**
 * @inheritDoc
 */
public function getUsername()
{
    return $this->username;
}

/**
 * @inheritDoc
 */
public function getSalt()
{
    // you *may* need a real salt depending on your encoder
    // see section on salt below
    return null;
}

/**
 * @inheritDoc
 */
public function getPassword()
{
    return $this->password;
}

/**
 * @inheritDoc
 */
public function getRoles()
{
    //return array('ROLE_USER');
    return $this->roles->toArray();
}

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

/**
 * @see \Serializable::serialize()
 */
public function serialize()
{
    return serialize(array(
        $this->id,
        $this->username,
        $this->password,
        // see section on salt below
        // $this->salt,
    ));
}

/**
 * @see \Serializable::unserialize()
 */
public function unserialize($serialized)
{
    list (
        $this->id,
        $this->username,
        $this->password,
        // see section on salt below
        // $this->salt
    ) = unserialize($serialized);
}


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set username
 *
 * @param string $username
 * @return User
 */
public function setUsername($username)
{
    $this->username = $username;

    return $this;
}

/**
 * Set password
 *
 * @param string $password
 * @return User
 */
public function setPassword($password)
{
    $this->password = $password;

    return $this;
}

/**
 * Set salt
 *
 * @param string $salt
 * @return User
 */
public function setSalt($salt)
{
    $this->salt = $salt;

    return $this;
}    

/**
 * Set email
 *
 * @param string $email
 * @return User
 */
public function setEmail($email)
{
    $this->email = $email;

    return $this;
}

/**
 * Get email
 *
 * @return string 
 */
public function getEmail()
{
    return $this->email;
}

/**
 * Set isActive
 *
 * @param boolean $isActive
 * @return User
 */
public function setIsActive($isActive)
{
    $this->isActive = $isActive;

    return $this;
}

/**
 * Get isActive
 *
 * @return boolean 
 */
public function getIsActive()
{
    return $this->isActive;
}

/**
 * Add roles
 *
 * @param \Bsi\BkpmBundle\Entity\Role $roles
 * @return User
 */
public function addRole(\Bsi\BkpmBundle\Entity\Role $roles)
{
    $this->roles[] = $roles;

    return $this;
}

/**
 * Remove roles
 *
 * @param \Bsi\BkpmBundle\Entity\Role $roles
 */
public function removeRole(\Bsi\BkpmBundle\Entity\Role $roles)
{
    $this->roles->removeElement($roles);
}

public function isEnabled() 
{        
    return $this->getIsActive();
}
public function isAccountNonExpired() 
{        
    return true;
}
public function isAccountNonLocked() 
{        
    return true;
}
public function isCredentialsNonExpired() 
{        
    return true;
}
}
0 голосов
/ 31 декабря 2014

Вы можете использовать ту же процедуру, описанную здесь для обработки паролей с истекшим сроком действия:

Как использовать свойство с истекшим сроком действия в Symfony AdvancedUserInterface?

За исключением того, что вы будете обрабатывать исключение Locked:

http://api.symfony.com/2.5/Symfony/Component/Security/Core/Exception/LockedException.html


Игнорировать этот раздел. Не применяется при использовании кода безопасности Symfony

Просто следуйте http://symfony.com/doc/current/cookbook/service_container/event_listener.html и обрабатывайте различные исключения безопасности:


При использовании кода безопасности Symfony

Вы не можете прослушивать события kernel.exception при работе с формой входа в систему. Код безопасности обрабатывает все исключения внутри.

Для обработки исключений безопасности при входе в систему необходимо реализовать:

Я сейчас внедряю в свой код. Есть несколько статей на эту тему, но их было трудно найти. Я опубликую их, когда проверю.


Обработчики успешных / неудачных попыток аутентификации не могут быть использованы для перенаправления на форму смены пароля, так как пользователю все готово отказано при выполнении.

Хотя они оказались отличными местами для отправки событий, таких как «account_disabled», «account_locked», «account_expired» или «credentials_expired».

Пока на странице назначения разрешены анонимные пользователи, вы можете перенаправлять пользователя куда угодно. Но если страница назначения требует входа в систему, у вас будет цикл перенаправления.

Для этого, вероятно, потребуется пользовательский слушатель аутентификации. Другой возможностью было бы реализовать прослушиватель загрузки учения и голосующего автора, который устанавливает флаг «временного пользователя», когда срок действия учетной записи / учетных данных истек, и позволяет доступ для изменения атрибутов пользователя.

Мне в конечном итоге понадобится реализовать какое-то похожее решение, но у меня сейчас нет времени.

Возможно, есть и другие способы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...