2015-02-14 3 views
1

Я делаю сайт Symfony2, но у меня возникли проблемы с выполнением пользовательской аутентификации. Форма регистрации работает отлично, но когда я пытаюсь войти в систему, я получил ошибку «Bad credentials».Плохие учетные данные в Symfony2

Конечно, я проверил поля своей базы данных и установил их на 255 символов для хэша sha512. Я даже пытался хранить пароль в текстовом виде, но я получил ту же ошибку.

Я использую Symfony 2.6.4 и PHP 5.5.14, работающие на Mac OS. Я не нашел ничего, что работает для меня на веб-сайте или на этом форуме, так что я надеюсь, что вы собираетесь найти то, что проблема здесь:/

Вот мой код:

#app/config/security.yml 

security: 
encoders: 
    Pass10\PersonBundle\Entity\Person: sha512 

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

providers: 
    person: 
     entity: { class: Pass10PersonBundle:Person, property: username } 

firewalls: 
    secured_area: 
     pattern: ^/user 
     provider: person 
     anonymous: true 
     form_login: 
      login_path: /user/login 
      check_path: /user/login_check 

access_control: 
    - { path: ^/admin, roles: ROLE_ADMIN } 

Файл маршрутизации:

#src/pass10/PersonBundle/Resources/Config/routing.yml 
pass10_person_login: 
    path:  /login 
    defaults: { _controller: Pass10PersonBundle:Person:login } 

pass10_person_login_check: 
    path:  /login_check 

pass10_person_logout: 
    path:  /logout 
    defaults: { _controller: Pass10PersonBundle:Person:logout } 

pass10_person_signup: 
    path:  /signup 
    defaults: { _controller: Pass10PersonBundle:Person:signup } 

И объект пользователя (я просто показать соответствующий код):

/** 
* Pass10\PersonBundle\Entity\Person 
* 
* @ORM\Table(name="person") 
* @ORM\Entity(repositoryClass="Pass10\PersonBundle\Entity\PersonRepository") 
*/ 
class Person implements UserInterface, \Serializable 
{ 
    /** 
    * @ORM\Column(type="string", length=30, unique=true) 
    */ 
    private $username; 

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

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

    public function __construct() 
    { 
     $this->isActive = true; 
     $this->salt = md5(uniqid(null, true)); 
     $this->createdAt = date_create(date('Y-m-d H:i:s')); 
    } 

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

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

    /** 
    * @inheritDoc 
    */ 
    public function getRoles() 
    { 
     return array('ROLE_USER'); 
    } 

    /** 
    * @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); 
    } 

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

     return $this; 
    } 
} 

И вот Код сохраняющиеся пользователь:

$factory = $this->get('security.encoder_factory'); 

$encoder = $factory->getEncoder($person); 
$password = $encoder->encodePassword($person->getPassword(), $person->getSalt()); 
$person->setPassword($password); 

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

loginAction в контроллере:

public function loginAction(Request $request){ 
    $session = $request->getSession(); 

    // get the login error if there is one 
    if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) { 
     $error = $request->attributes->get(Security::AUTHENTICATION_ERROR); 
    } else { 
     $error = $session->get(Security::AUTHENTICATION_ERROR); 
     $session->remove(Security::AUTHENTICATION_ERROR); 
    } 

    $person = new Person(); 
    $form = $this->createForm('login', $person); 


    return $this->render('Pass10PersonBundle:Person:login.html.twig', array(
     'form' => $form->createView(), 
     // last username entered by the user 
     'last_username' => $session->get(Security::LAST_USERNAME), 
     'error'   => $error, 
    )); 
} 

И вид

{% extends '::base.html.twig' %} 

{% block main_content %} 
    {% if error %} 
     <div>{{ error.message }}</div> 
    {% endif %} 

    {{ form(form, {'action': path('pass10_person_login_check')}) }} 
{% endblock %} 
+0

Это много кода. Чтобы получить лучший и быстрый ответ, можете ли вы разбить его на то, что, по вашему мнению, является соответствующим кодом? – rfornal

+0

Конечно, он обновляется! – Off

+0

вы можете поделиться своим видом входа и действиями входа в систему – Baig

ответ

0

У меня есть чувство, ваша форма Логин не правильно, глядя на documentation of symfony говорит:

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

и требования к имени пользователя и паролю следуют в соответствии с той же документацией.

Форма может выглядеть как угодно, но есть несколько требований:

  • Форма должна POST к/login_check, так это то, что вы настроили под ключ form_login в security.yml.
  • Имя пользователя должно иметь имя _username и пароль должен содержать имя _password.

Ваша форма для входа в систему, кажется, отсутствует _username и _password. Попробуйте использовать следующий код на ваш взгляд входа

{% if error %} 
    <div>{{ error.messageKey|trans(error.messageData) }}</div> 
{% endif %} 

<form action="{{ path('login_check') }}" method="post"> 
    <label for="username">Username:</label> 
    <input type="text" id="username" name="_username" value="{{ last_username }}" /> 

    <label for="password">Password:</label> 
    <input type="password" id="password" name="_password" /> 

    {# 
     If you want to control the URL the user 
     is redirected to on success (more details below) 
     <input type="hidden" name="_target_path" value="/account" /> 
    #} 

    <button type="submit">login</button> 
</form> 

Я надеюсь, что это помогает.

Не забудьте изменить {{ path('login_check') }} на тот, который вы настроили

+0

О, спасибо, Байг! Я чувствую себя идиотом за то, что пропустил это! – Off

+0

Не беспокойтесь, сделайте перерыв. Я рад, что он решил вашу проблему. – Baig

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