2017-07-03 24 views
2

まず、私はこのプロジェクトで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) { 
} 
+0

最近、同様の問題が追加されました。問題は、config.ymlのframework.session.cookie_secureがtrueだったのに対し、HTTPSを使用しないでログインしようとしていたことでした。アプリはCookieを作成できませんでした。これが同じ問題であるかどうかはわかりませんが、ログインできず、エラーもありませんでした。 – Picoss

+0

ありがとう@Picoss、私はそのパラメータをconfig.ymlに全く設定していません。私は/ webディレクトリ上のphp.iniをチェックしました。それにMAMPのPHP情報session.cookie_secureとsession.cookie_httponlyはオフになっています。 – BernardA

+0

ハム私はあなたが正しくないPOSTを送信するURLだと思います。あなたは/ loginではなく/ login_checkでフォームを提出するべきではありません。または、/ loginにログインフォームをPOSTする場合は、ファイアウォールの設定login_pathとcheck_pathを追加します。 「triditionalログインフォームを構築する方法」に関するSymfony2のドキュメントをご覧ください:http://symfony.com/doc/current/security/form_login_setup.html – Picoss

答えて

0

これは上記の設定では機能しません。 SymfonyはAjaxでうまく動かないので、ログインをカスタマイズする必要があります。

セットアップ全体でthis questionの回答を追加しました。

関連する問題