2013-06-25 5 views
0

Я грубо следил за инструкциями Symbian Security и How to load Security Users from the Database с некоторыми небольшими пользовательскими настройками, но я не могу войти в систему, используя пользователей, которых у меня есть в моей базе данных! Пользователь in_memory работает отлично!Symfony2.2 Login from Database Error: «Bad Credentials»

Это мой security.yml:

jms_security_extra: 
    secure_all_services: false 
    expressions: true 

security: 
    encoders: 
     NEWS\BlogBundle\Entity\Author: plaintext 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 


    providers: 
     chain_provider: 
      chain: 
       providers: [user_db, in_memory] 
     user_db: 
      entity: { class: NEWSBlogBundle:Author , property: username } 

     in_memory: 
      memory: 
       users: 
        admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } 

    firewalls: 
     admin_area: 
        pattern: ^/admin 
        http_basic: ~ 
     secured_area: 
        pattern: ^/ 
        anonymous: ~ 
        form_login: 
         login_path: /Login 
         check_path: /login_check 
         username_parameter: username 
         password_parameter: password 

        logout: 
         path: /logout 
         target: /blog 


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

И моя сущность Author.php (Пользователь) (я удалил функции аннотаций, чтобы сделать его короче):

<?php 

namespace NEWS\BlogBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 


/** 
* Author 
*/ 
class Author implements \Symfony\Component\Security\Core\User\AdvancedUserInterface, \Serializable 

{ 
    /** 
    * @var integer 
    */ 
    private $id; 

    /** 
    * @var string 
    */ 
    private $username; 

    /** 
    * @var string 
    */ 
    private $password; 

    /** 
    * @var string 
    */ 
    private $Name; 

    /** 
    * @var string 
    */ 
    private $Surname; 

    /** 
    * @var string 
    */ 
    private $salt; 

    /** 
    * @var boolean 
    */ 
    private $isActive; 


    /** 
    * @var \NEWS\BlogBundle\Entity\Category 
    */ 
    private $category; 





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


    public function setUsername($username) 
    { 
     $this->username = $username; 

     return $this; 
    } 

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

    public function setPassword($password) 
    { 
     $this->password = $password; 

     return $this; 
    } 

    public function getPassword() 
    { 
     return $this->password; 
    } 

    public function setCategory(\NEWS\BlogBundle\Entity\Category $category = null) 
    { 
     $this->category = $category; 

     return $this; 
    } 

    public function getCategory() 
    { 
     return $this->category; 
    } 

    public function setName($name) 
    { 
     $this->Name = $name; 

     return $this; 
    } 

    public function getName() 
    { 
     return $this->Name; 
    } 

    public function setSurname($surname) 
    { 
     $this->Surname = $surname; 

     return $this; 
    } 

    public function getSurname() 
    { 
     return $this->Surname; 
    } 

    public function __construct() 
    { 
     $this->isActive = true; 
     $this-> salt = sha1(uniqid(null, true)); 
    } 

    public function setSalt($salt) 
    { 
     $this->salt = $salt; 

     return $this; 
    } 

    public function getSalt() 
    { 
     return $this->salt; 
    } 

    public function setIsActive($isActive) 
    { 
     $this->isActive = $isActive; 

     return $this; 
    } 

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

    public function isAccountNonExpired() 
    { 
     // TODO: Implement isAccountNonExpired() method. 
     return true; 
    } 

    public function isAccountNonLocked() 
    { 
     // TODO: Implement isAccountNonLocked() method. 
     return true; 
    } 

    public function isCredentialsNonExpired() 
    { 
     return true; 
    } 
    public function isEnabled() 
    { 
      return $this->isActive; 
    } 
    public function getRoles() 
    { 
     return array('ROLE_USER'); 
    } 

    public function eraseCredentials() 
    { 
     // TODO: Implement eraseCredentials() method. 
    } 
    /** 
    * @var \Doctrine\Common\Collections\Collection 
    */ 
    private $posts; 


    public function addPost(\NEWS\BlogBundle\Entity\Post $posts) 
    { 
     $this->posts[] = $posts; 

     return $this; 
    } 

    public function removePost(\NEWS\BlogBundle\Entity\Post $posts) 
    { 
     $this->posts->removeElement($posts); 
    } 

    public function getPosts() 
    { 
     return $this->posts; 
    } 

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

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

Это мой Login.html.twig

{# src/NEWS/BlogBundle/Resources/views/Page/Login.html.twig #} 
{% extends 'NEWSBlogBundle::layout.html.twig' %} 

{% block title %}Login Page{% endblock%} 

{% block body %} 
    <header> 

    </header> 

    {% if app.session.hasFlash('blogger-notice') %} 
     <div class="blogger-notice"> 
      {{ app.session.flash('blogger-notice') }} 
     </div> 

    {% endif %} 


    {% if error %} 
     <div>{{ error.message }}</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" /> 


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

{% endblock %} 

Войти контроллер:

public function LoginAction() 
    { 

     $request = $this->getRequest(); 
     $session = $request->getSession(); 

     // get the login error if there is one 
     if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { 
      $error = $request->attributes->get(
       SecurityContext::AUTHENTICATION_ERROR 
      ); 

     } else { 
      $error = $session->get(SecurityContext::AUTHENTICATION_ERROR); 
      $session->remove(SecurityContext::AUTHENTICATION_ERROR); 
     } 

     return $this->render(
      'NEWSBlogBundle:Page:Login.html.twig', 
      array(
       // last username entered by the user 
       'last_username' => $session->get(SecurityContext::LAST_USERNAME), 
       'error'   => $error, 
      ) 
     ); 
    } 

и функция, которая строит свою регистрационную форму:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('username', 'text'); 
     $builder->add('password', 'password'); 
     return $builder->getForm(); 
    } 

Я пытался решить эту проблему в течение трех дней, но не был успешен! Я бы очень признателен за любую помощь!

Я не знаю, нужны ли функции регистрации или нет, я не включаю их прямо сейчас, так как вопрос достаточно длинный!

PS: Мой логин для входа намеренно начинается с заглавной буквы, и я знаю, что я удалил '_' из параметров user/pass, я попытался изменить их обратно в исходную форму, но stil получил ту же ошибку !

+0

сообщения об ошибке «Bad учетных данных» возвращаются, когда имя пользователя/пароль не совпадает. Из вашего security.yml я понимаю, что вы храните пароли как открытый текст, это правильно или они закодированы, например. с md5, sha1 или что-то еще? – dbrumann

+0

Я понимаю это, но я не понимаю, почему это происходит! В настоящее время я храню их в виде открытого текста, чтобы я мог отслеживать, что происходит. Что я вижу в своей базе данных - это пароль, который НЕ закодирован и соль, которая закодирована. –

+0

Проверьте свои сообщения об ошибках/logs/dev.log. Чтобы проверить, не вызывает ли ваша соль никаких проблем, временно измените getSalt на возврат null: 'getSalt() {return null; } 'Таким образом, вы можете убедиться, что соль не проблема. – dbrumann

ответ

1

поле ввода должно содержать подчеркивание

<input type="text" id="username" name="_username" value="{{ last_username }}" /> 

<input type="password" id="password" name="_password" /> 

выглядит смешно, но перед его