0

私は Symfony のセキュリティデータベースからセキュリティ ユーザーをロードする方法の指示にいくつかの小さなカスタム構成で大まかに従いましたが、データベースにあるユーザーを使用してログインできません! in_memory ユーザーは正常に動作します!

これは私の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 (User) エンティティ (短くするために関数の注釈を削除しました):

<?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();
    }

私はこれを3日間解決しようとしてきましたが、成功しませんでした! 私は本当に助けていただければ幸いです!

登録機能も必要かどうかはわかりませんが、質問がこれまでのところ十分に長いため、現在は含めていません!

PS: 私のログイン ルートは意図的に大文字で始まり、user/pass パラメータから「_」を削除したことを認識しています。それらを元の形式に戻そうとしましたが、それでも同じエラーが発生しました!

4

1 に答える 1

1

入力フィールドにはアンダースコアが含まれている必要があります

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

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

面白そうに見えますが、それに直面しました

于 2015-11-09T18:56:16.187 に答える