まず、私はこのプロジェクトでFOSUserBundleを使用していません。だから、それを邪魔しないようにしましょう。Symfony 3がajaxでログインできない
私は、ユーザーを登録することができますが、彼をログに記録することができません。
私はそのフォームがLoginControllerに掲載されており、それがauthenticationUtilsオブジェクトを生成し、それがエラーを生成するの短い停止し、場合でも検証下記の行があります。
$ error = $ authUtils-> getLastAuthenticationError();
それ以外の場合、エラーは発生しません。それは黙って失敗します。 _wdtは正しい資格情報を提供しても匿名として表示され続けます。
のsecurity.yml
security:
encoders:
UsedBundle\Entity\User:
algorithm: bcrypt
providers:
db_provider:
entity:
class: UsedBundle:User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
provider: db_provider
form_login:
username_parameter: _email
ログインコントローラ: UsedBundle \コントローラ\ LoginController
namespace UsedBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
class LoginController extends Controller
{
/**
* @Route("/login", name="login")
*/
public function loginAction(Request $request)
{
if ($request->isMethod('POST')) {
var_dump($_POST);
$authUtils = $this->get('security.authentication_utils');
// get the login error if there is one
$error = $authUtils->getLastAuthenticationError();
var_dump($error);
var_dump($authUtils);
if(isset($error)){
$message = $error->getMessageData();
var_dump($message);
}
// last username entered by the user
$lastUsername= $authUtils->getLastUsername();
return new JsonResponse(array(
'last_username' => $lastUsername,
'error' => $error,)
);
}else{
return $this->render('common/login.html.twig');
}
}
}
フォームテンプレート:ビュー\リソース\
アプリ\共通\ login.htmlと.twig
{% if error is defined and error is not null %}
{{ dump(error) }}
<div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% else %}
<form action="" method="post" name="login_form" id="login_form" >
<div class="contact" >
<input type="email" id="email" name="_email" class="form-control" placeholder="e-mail" value=" {% if last_username is defined %}
{{ last_username }}
{% endif %}
" />
</div>
<div class="contact" >
<input type="password" id="password" name="_password" placeholder="mot de passe" />
</div>
<div>
<button type="submit" class="sub_ok btn btn-sm" name="submit" >Valider</button>
</div>
</form>
{% endif %}
Userエンティティは、電子メールを返すように設定getUsername()メソッドを持っています
namespace UsedBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="UsedBundle\Repository\UserRepository")
* @UniqueEntity(fields="email", message="Email already taken")
* @UniqueEntity(fields="avatar", message="Username already taken")
*/
class User implements UserInterface, \Serializable
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=50, unique=true)
* @Assert\Regex(
* pattern="/^[A-Za-z0-9\s_\-.]{5,50}$/",
* message="Minimum 5 caracteres, max 50."
* )
*/
private $avatar;
/**
* @ORM\Column(type="string", length=50)
* @Assert\Regex(
* pattern="/^[a-zA-Z\s]{5,50}$/",
* message="Minimum 5 lettres, max 50."
* )
*/
private $name;
/**
* @ORM\Column(type="string", length=64)
*/
private $password;
/**
* @Assert\Length(max=4096)
* @Assert\Regex(
* pattern="/^.{8,50}$/",
* message="Minimum 8 caracteres, max 50."
* )
*/
private $plainPassword;
/**
* @ORM\Column(type="string", length=100, unique=true)
* @Assert\NotBlank()
* @Assert\Email()
*/
private $email;
/**
* @ORM\Column(type="string", length=50)
* @Assert\Regex(
* pattern="/^[0-9]{10,20}$/",
* message="Minimum 5 lettres, max 50."
* )
*/
private $phone;
/**
* @ORM\Column(type="string", length=50)
*/
private $role;
/**
* @ORM\Column(type="boolean")
*/
private $isActive;
/**
* @ORM\Column(type="string", length=64)
*/
private $userKey;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $userKeyTime;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime()
*/
private $dateReg;
/**
* @ORM\Column(type="string", length=10)
*/
private $blogSubs;
/**
* Many users for one city
* @ORM\ManyToOne(targetEntity="City",inversedBy="users")
* @ORM\JoinColumn(name="city_id", referencedColumnName="id")
*/
private $cityId;
/**
* one visitor may correspond to one user
*
* @ORM\OneToOne(targetEntity="Visitor", mappedBy="userId")
*/
private $visitor;
public function __construct()
{
$this->isActive = false;
$this->role = 'ROLE_USER';
//$this->blogSubs = 0;
}
public function getUsername()
{
return $this->email;
}
public function getSalt()
{
return null;
}
public function getPassword()
{
return $this->password;
}
public function getRoles()
{
return array('ROLE_USER');
}
public function eraseCredentials()
{
}
/** @see \Serializable::serialize() */
public function serialize()
{
return serialize(array(
$this->id,
$this->username,
$this->password,
// $this->salt,
));
}
/** @see \Serializable::unserialize() */
public function unserialize($serialized)
{
list (
$this->id,
$this->username,
$this->password,
// $this->salt
) = unserialize($serialized);
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set avatar
*
* @param string $avatar
*
* @return User
*/
public function setAvatar($avatar)
{
$this->avatar = $avatar;
return $this;
}
/**
* Get avatar
*
* @return string
*/
public function getAvatar()
{
return $this->avatar;
}
/**
* Set name
*
* @param string $name
*
* @return User
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* 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 phone
*
* @param string $phone
*
* @return User
*/
public function setPhone($phone)
{
$this->phone = $phone;
return $this;
}
/**
* Get phone
*
* @return string
*/
public function getPhone()
{
return $this->phone;
}
/**
* 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;
}
/**
* Set userKey
*
* @param string $email
*
* @return User
*/
public function setUserKey($email)
{
$cur_time = time();
$this->userKey = password_hash($email.$cur_time, PASSWORD_BCRYPT)."\n";
return $this;
}
/**
* Get userKey
*
* @return string
*/
public function getUserKey()
{
return $this->userKey;
}
/**
* Set userKeyTime
*
*
* @return User
*/
public function setUserKeyTime($hours_added = null)
{
if ($hours_added === null){
$hours_added = 20;
$literal_time = \DateTime::createFromFormat('Y-m-d H:i:s',date("Y-m-d H:i:s", strtotime('+' . $hours_added . ' hours')));
}else{
$literal_time = \DateTime::createFromFormat('Y-m-d H:i:s',date("Y-m-d H:i:s", time()));
}
$this->userKeyTime = $literal_time;
return $this;
}
/**
* Get userKeyTime
*
* @return \DateTime
*/
public function getUserKeyTime()
{
return $this->userKeyTime;
}
/**
* Get dateReg
*
* @return \DateTime
*/
public function getDateReg()
{
return $this->dateReg;
}
/**
* Set dateReg
*
* @return \DateTime
*/
public function setDateReg()
{
$literal_time = \DateTime::createFromFormat('Y-m-d H:i:s',date("Y-m-d H:i:s"));
$this->dateReg = $literal_time;
return $this;
}
/**
* Set role
*
* @param string $role
*
* @return User
*/
public function setRole($role)
{
$this->role = $role;
return $this;
}
/**
* Get role
*
* @return string
*/
public function getRole()
{
return $this->role;
}
/**
* Set blogSubs
*
* @param string $blogSubs
*
* @return User
*/
public function setBlogSubs($blogSubs)
{
$this->blogSubs = $blogSubs;
return $this;
}
/**
* Get blogSubs
*
* @return string
*/
public function getBlogSubs()
{
return $this->blogSubs;
}
/**
* Get plainPassword
*
* @return string
*/
public function getPlainPassword()
{
return $this->plainPassword;
}
/**
* Set cityId
*
* @param \UsedBundle\Entity\City $cityId
*
* @return User
*/
public function setCityId(\UsedBundle\Entity\City $cityId = null)
{
$this->cityId = $cityId;
return $this;
}
/**
* Get cityId
*
* @return \UsedBundle\Entity\City
*/
public function getCityId()
{
return $this->cityId;
}
/**
* Set models
*
* @param \UsedBundle\Entity\Visitor $models
*
* @return User
*/
public function setModels(\UsedBundle\Entity\Visitor $models = null)
{
$this->models = $models;
return $this;
}
/**
* Get models
*
* @return \UsedBundle\Entity\Visitor
*/
public function getModels()
{
return $this->models;
}
/**
* Set visitor
*
* @param \UsedBundle\Entity\Visitor $visitor
*
* @return User
*/
public function setVisitor(\UsedBundle\Entity\Visitor $visitor = null)
{
$this->visitor = $visitor;
return $this;
}
/**
* Get visitor
*
* @return \UsedBundle\Entity\Visitor
*/
public function getVisitor()
{
return $this->visitor;
}
}
次のようにフォームは、Ajaxを経由して送信されます:私はFirebugのから以下の出力を追加してい
$(document).ready(function() {
$('#login_form').submit(function(e) {
var str = $("#login_form").serialize();
$.ajax({
url: "/login",
type: "POST",
dataType: "json",
data: str,
success: function(data) {
alert(data);
}
e.preventDefault(); //STOP default action
});
});
});
。私はそれがどのように起こったのか正確にはわかりませんが、ロールのプロパティが空であることを示しています。まだわからないすべてのユーザーのデータベースにROLE_USERが設定されています
object(Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken)#2384 (6) {
["credentials":"Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken":private]=>
string(8) "senha444"
["providerKey":"Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken":private]=>
string(4) "main"
["user":"Symfony\Component\Security\Core\Authentication\Token\AbstractToken":private]=>
string(22) "[email protected]"
["roles":"Symfony\Component\Security\Core\Authentication\Token\AbstractToken":private]=>
array(0) {
}
["authenticated":"Symfony\Component\Security\Core\Authentication\Token\AbstractToken":private]=>
bool(false)
["attributes":"Symfony\Component\Security\Core\Authentication\Token\AbstractToken":private]=>
array(0) {
}
最近、同様の問題が追加されました。問題は、config.ymlのframework.session.cookie_secureがtrueだったのに対し、HTTPSを使用しないでログインしようとしていたことでした。アプリはCookieを作成できませんでした。これが同じ問題であるかどうかはわかりませんが、ログインできず、エラーもありませんでした。 – Picoss
ありがとう@Picoss、私はそのパラメータをconfig.ymlに全く設定していません。私は/ webディレクトリ上のphp.iniをチェックしました。それにMAMPのPHP情報session.cookie_secureとsession.cookie_httponlyはオフになっています。 – BernardA
ハム私はあなたが正しくないPOSTを送信するURLだと思います。あなたは/ loginではなく/ login_checkでフォームを提出するべきではありません。または、/ loginにログインフォームをPOSTする場合は、ファイアウォールの設定login_pathとcheck_pathを追加します。 「triditionalログインフォームを構築する方法」に関するSymfony2のドキュメントをご覧ください:http://symfony.com/doc/current/security/form_login_setup.html – Picoss