私は 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 パラメータから「_」を削除したことを認識しています。それらを元の形式に戻そうとしましたが、それでも同じエラーが発生しました!