2013-11-23 2 views
3

Я пытаюсь изменить свой кодер безопасности из открытого текста на sha512. Я сделал все, что указано в руководстве, и все, что я мог найти в Интернете.Symfony2 Security, используя sha512, не работает. Получение сообщения о неверных учетных данных

Я уже увеличил размеры полей до 255 как для пароля, так и для соли. Я пробовал с солью и без нее ... Я тоже пробовал sha1 и md5.

Может ли кто-нибудь взглянуть на мой код и дать мне несколько идей для возможного решения? Сообщите мне, если вам нужна другая информация.

Security Config

security: 
encoders: 
    Symfony\Component\Security\Core\User\User: plaintext 
    Mortolian\Bundle\SecurityBundle\Entity\User: 
     algorithm: sha512 
     encode_as_base64: true 
     iterations: 3 

role_hierarchy: 
    # ROLE_B - Business Role 
    # ROLE_ADMIN - Administrators Role 

    ROLE_B: ROLE_B 
    ROLE_ADMIN: [ROLE_B, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

providers: 
    chain_provider: 
     chain: 
      providers: [user_db, in_memory] 
    in_memory: 
     memory: 
      users: 
       gideon: { password: 2open1, roles: [ 'ROLE_B' ] } 
       admin: { password: admin, roles: [ 'ROLE_ADMIN' ] } 
    user_db: 
     entity: { class: Mortolian\Bundle\SecurityBundle\Entity\User, property: username } 

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

    login: 
     pattern: ^/$ 
     security: false 

    backoffice_security: 
     pattern: ^(/business/|/security/) 
     form_login: 
      check_path: mrt_security_check 
      login_path: spacecom_business_homepage 
      always_use_default_target_path: true 
      default_target_path: spacecom_business_dashboard 
     logout: 
      path: mrt_security_logout 
      target:/
     anonymous: ~ 
     #http_basic: 
     # realm: "Secured Demo Area" 

access_control: 
    - { path: ^/security/, roles: ROLE_ADMIN } 
    - { path: ^/business/, roles: ROLE_B } 
    #- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 

Entity Пользователь

<?php 

namespace Mortolian\Bundle\SecurityBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 
use Symfony\Component\Security\Core\User\UserInterface; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

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

/** 
* @ORM\Column(type="string", length=255) 
*/ 
private $fullname; 

/** 
* @ORM\Column(type="string", length=255) 
*/ 
private $telephone; 

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

/** 
* @ORM\Column(type="string", length=255, nullable=true) 
*/ 
private $salt; 

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

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

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

/** 
* @var \Doctrine\Common\Collections\ArrayCollection $userRoles 
* @ORM\ManyToMany(targetEntity="Role", inversedBy="users") 
*/ 
private $userRoles; 


/* 
* CLASS MAGIC FUNCTIONS 
*/ 
public function __construct() { 
    $this->userRoles = new \Doctrine\Common\Collections\ArrayCollection(); 
    //$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36); 
} 

public function __toString() { 
    return $this->username; 
} 


/* 
* GETTERS AND SETTERS 
*/ 
/** 
* @inheritDoc 
*/ 
public function getId() { 
    return $this->id; 
} 

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

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

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

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

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

/** 
* Get roles 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getUserRoles() { 
    return $this->userRoles; 
} 

/** 
* Get roles 
* 
* @return array 
*/ 
public function getRoles() { 
    return $this->userRoles->toArray(); 
} 

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

/** 
* 
* @see \Serializable::serialize() 
*/ 
public function serialize() { 
    return serialize (array (
      $this->id 
    )); 
} 

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

/** 
* @inheritDoc 
*/ 
public function isAccountNonExpired() { 
    return true; 
} 

/** 
* @inheritDoc 
*/ 
public function isAccountNonLocked() { 
    return true; 
} 

/** 
* @inheritDoc 
*/ 
public function isCredentialsNonExpired() { 
    return true; 
} 

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

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

    return $this; 
} 

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

    return $this; 
} 

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

    return $this; 
} 

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

    return $this; 
} 

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

    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 \Mortolian\Bundle\SecurityBundle\Entity\Role $roles   
* @return User 
*/ 
public function addUserRole(\Mortolian\Bundle\SecurityBundle\Entity\Role $userRoles) { 
    $this->userRoles [] = $userRoles; 

    return $this; 
} 

/** 
* Remove roles 
* 
* @param \Mortolian\Bundle\SecurityBundle\Entity\Role $userRoles   
*/ 
public function removeUserRole(\Mortolian\Bundle\SecurityBundle\Entity\Role $userRoles) { 
    $this->roles->removeElement ($userRoles); 
} 
} 

Код, используемый для создания нового пользователя

/** 
* Creates a new User entity. 
* 
* @Route("/", name="user_create") 
* @Method("POST") 
* @Template("MortolianSecurityBundle:User:new.html.twig") 
*/ 
public function createAction(Request $request) 
{ 
    $entity = new User(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     //encrypt user password 
     $factory = $this->get('security.encoder_factory'); 
     $encoder = $factory->getEncoder($entity); 

     //generate password 
     $password = $encoder->encodePassword($form["password"]->getData(), $entity->getSalt()); 

     if (!$encoder->isPasswordValid($password, $form["password"]->getData(), $entity->getSalt())) { 
      throw new \Exception('Password incorrectly encoded during user registration'); 
     } else { 
      $entity->setPassword($password); 
     } 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('user_show', array('id' => $entity->getId()))); 
    } 

    return array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    ); 
} 
+0

Как вы ввели пароль в базу данных? Он уже закодирован? –

+0

Я использовал метод кодирования для вставки пароля. Я также проверил, что после кодирования пароля он имеет правильную кодировку. Действие вставки выложено выше, если вам нужно больше деталей. Я также вставляю соль в базу данных. – Mortolian

+0

Соль: gxmc6n4wq74kg08sscgc4gogsocw4kc, пароль: 27bf6cc2f96533920a473e141c7398e17f7d1fe4d8869872eeda4fb107e8e6baadf9101a253beeb485ad08d8063a55287a7ccee94e8ae3ac67c7312c43da6ade – Mortolian

ответ

1

Ааааа ... я нашел его. Разделив пакет Symfony Security, я увидел, что он никогда не получал запись из базы данных, которую я подтвердил. Я сравнил имя пользователя, которое оказалось в методе (retrieveUser()), который проверил это, и, конечно же, имя пользователя было неверным, когда оно оказалось в той части, которая извлекала запись из базы данных, чтобы подтвердить достоверность учетных данных.

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

Проверьте свое имя пользователя в DaoAuthenticationProvider.php -> retrieveUser(). Также добавьте die(); перед тем, как анонимный провайдер вызывается в AuthenticationProviderManager().

ULTIMATELY: Убедитесь, что ваша организация настроена правильно.

Смежные вопросы