加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 在encodePassword中使用salt的Symfony

发布时间:2020-12-13 16:56:12 所属栏目:PHP教程 来源:网络整理
导读:我正在使用Symfony 2.6.6,我目前正在尝试在我的数据库用户上使用salt.在注册过程中,我执行以下哈希,同时通过Doctrine持久保存用户信息. SRC /的appbundle /表格/ RegisterFormType.php ?php$account-setSalt(base_convert(sha1(uniqid(mt_rand(),true)),16,3
我正在使用Symfony 2.6.6,我目前正在尝试在我的数据库用户上使用salt.在注册过程中,我执行以下哈希,同时通过Doctrine持久保存用户信息.

SRC /的appbundle /表格/ RegisterFormType.php

<?php

$account->setSalt(base_convert(sha1(uniqid(mt_rand(),true)),16,36));
$account->setPassword($this->encodePassword($account,$account->getPlainPassword()));

在同一个文件中我有这个功能:

<?php

private function encodePassword(Account $account,$plainPassword)
{
    $encoder = $this->container->get('security.encoder_factory')->getEncoder($account);

    return $encoder->encodePassword($plainPassword,$account->getSalt());
}

这是我的security.yml文件:

应用程序/配置/ security.yml

security:
    encoders:
        AppBundleEntityAccount: bcrypt

    providers:
        database_users:
            entity: { class: AppBundle:Account }

    role_hierarchy:
        ROLE_ADMIN:       [ROLE_USER,ROLE_ALLOWED_TO_SWITCH]
        ROLE_SUPER_ADMIN: [ROLE_USER,ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH]

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt|error)|css|images|js)/
            security: false

        prod:
            pattern: ^/
            form_login:
                check_path: account_login_check
                login_path: account_login
                csrf_provider: form.csrf_provider
            logout:
                path: account_logout
                target: home
            anonymous: ~
            switch_user: ~
            remember_me:
                key: "%secret%"

    access_control:
        - { path: ^/account/login,roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/account/register,roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/account/logout,roles: IS_AUTHENTICATED_FULLY }

在我的实体中,这些是盐键:

SRC /的appbundle /实体/ Account.php

<?php // src/AppBundle/Entity/Account.php

namespace AppBundleEntity;

use DoctrineORMMapping as ORM;
use SymfonyComponentSecurityCoreRoleRole;
use SymfonyComponentSecurityCoreUserAdvancedUserInterface;
use Serializable;
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;

/**
 * @ORMTable(name="accounts")
 * @ORMEntity(repositoryClass="AppBundleEntityAccountRepository")
 * @UniqueEntity(fields="username",message="That username is taken!")
 * @UniqueEntity(fields="email",message="That email is taken!")
 */
class Account implements AdvancedUserInterface,Serializable
{
    /**
     * @ORMColumn(name="id",type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORMColumn(name="username",type="string",length=30)
     * @AssertNotBlank(message="Give us at least 3 characters")
     * @AssertLength(min=3,minMessage="Give us at least 3 characters!")
     */
    private $username;

    /**
     * @ORMColumn(name="password",length=255)
     */
    private $password;

    /**
     * @ORMColumn(name="salt",type="string")
     */
    private $salt;

    /**
     * @ORMColumn(type="string",length=120)
     * @AssertNotBlank
     * @AssertEmail
     */
    private $email;

    /**
     * @ORMColumn(type="json_array")
     */
    private $roles = array();

    /**
     * @ORMColumn(type="boolean")
     */
    private $isActive = false;

    /**
     * @AssertNotBlank
     * @AssertRegex(
     *      pattern="/^(?=.*d)(?=.*[a-z])(?=.*[A-Z])(?!.*s).*$/",*      message="Use 1 upper case letter,1 lower case letter,and 1 number"
     * )
     */
    private $plainPassword;

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

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

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

        return $this;
    }

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

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

        return $this;
    }

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

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

        return $this;
    }

    /**
     * @return string
     */
    public function getPlainPassword()
    {
        return $this->plainPassword;
    }

    /**
     * @param $plainPassword
     * @return string
     */
    public function setPlainPassword($plainPassword)
    {
        $this->plainPassword = $plainPassword;

        return $this;
    }

    /**
     * @return array Role
     */
    public function getRoles()
    {
        $roles = $this->roles;
        $roles[] = 'ROLE_USER';

        return array_unique($roles);
    }

    /**
     * @param array $roles
     * @return Role
     */
    public function setRoles(array $roles)
    {
        $this->roles = $roles;

        return $this;
    }

    /**
     * Removes sensitive data from the user
     */
    public function eraseCredentials()
    {
        $this->setPlainPassword(null);
    }

    /**
     * @return string
     */
    public function getSalt()
    {
        return $this->salt;
    }

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

        return $this;
    }

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

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

    public function isAccountNonExpired()
    {
        return true;
    }

    public function isAccountNonLocked()
    {
        return true;
    }

    public function isCredentialsNonExpired()
    {
        return true;
    }

    public function isEnabled()
    {
        return $this->getIsActive();
    }

    public function serialize()
    {
        return serialize(array(
            $this->id,$this->username,$this->password,$this->salt
        ));
    }

    public function unserialize($serialized)
    {
        list (
            $this->id,$this->salt
        ) = unserialize($serialized);
    }
}

当我登录时,它可以工作,但是Profiler告诉我Authenticated?说没有.当我将salt更改为数据库中的不同内容时,用户仍然可以登录.

是否有我在Symfony文档中遗漏的内容或者我是否需要更改整个salting方式?

编辑:对不起,我没有包括我序列化和反序列化$this->密码,$this-> salt.

编辑2:包含app / config / security.yml并按用户发布完整的src / AppBundle / Entity / Account.php文件:ghanbari的请求.

感谢您阅读我的问题.

解决方法

首先,您的User对象必须实现Serializable接口,并且您必须序列化id&盐.

阅读this.

编辑:你的实体类必须是这样的:

<?php // src/AppBundle/Entity/Account.php

namespace AppBundleEntity;

use DoctrineORMMapping as ORM;
use SymfonyComponentSecurityCoreRoleRole;
use SymfonyComponentSecurityCoreUserAdvancedUserInterface;
use Serializable;
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;

/**
 * @ORMTable(name="accounts")
 * @ORMEntity(repositoryClass="AppBundleEntityAccountRepository")
 * @UniqueEntity(fields="username",and 1 number"
     * )
     */
    private $plainPassword;

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

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

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

        return $this;
    }

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

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

        return $this;
    }

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

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

        return $this;
    }

    /**
     * @return string
     */
    public function getPlainPassword()
    {
        return $this->plainPassword;
    }

    /**
     * @param $plainPassword
     * @return string
     */
    public function setPlainPassword($plainPassword)
    {
        $this->plainPassword = $plainPassword;

        return $this;
    }

    /**
     * @return array Role
     */
    public function getRoles()
    {
        $roles = $this->roles;
        $roles[] = 'ROLE_USER';

        return array_unique($roles);
    }

    /**
     * @param array $roles
     * @return Role
     */
    public function setRoles(array $roles)
    {
        $this->roles = $roles;

        return $this;
    }

    /**
     * Removes sensitive data from the user
     */
    public function eraseCredentials()
    {
        $this->setPlainPassword(null);
    }

    /**
     * @return string
     */
    public function getSalt()
    {
        return null;
    }

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

        return $this;
    }

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

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

    public function isAccountNonExpired()
    {
        return true;
    }

    public function isAccountNonLocked()
    {
        return true;
    }

    public function isCredentialsNonExpired()
    {
        return true;
    }

    public function isEnabled()
    {
        return $this->getIsActive();
    }

    public function serialize()
    {
        return serialize(array(
            $this->id,$this->salt,$this->isActive
        ));
    }

    public function unserialize($serialized)
    {
        list (
            $this->id,$this->isActive
            ) = unserialize($serialized);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读