Php Symfony 4登录访问:无数据持久性
我需要做一个登录表单,允许已识别的访问者访问管理面板 我有一个表格作为管理员登录。只要有人想访问路径Php Symfony 4登录访问:无数据持久性,php,symfony,Php,Symfony,我需要做一个登录表单,允许已识别的访问者访问管理面板 我有一个表格作为管理员登录。只要有人想访问路径/admin*,就会重定向到此登录表单 但是,我在数据持久性方面有一个问题,似乎我从未登录过 My security.yaml文件: 我的主控制器: 我的HTML表单: 连接 PHP 在我的用户实体中,允许我仅创建由其电子邮件标识的管理员用户,我有: <?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Sy
/admin*
,就会重定向到此登录表单
但是,我在数据持久性方面有一个问题,似乎我从未登录过
My security.yaml文件:
我的主控制器:
我的HTML表单:
连接
PHP
在我的用户实体中,允许我仅创建由其电子邮件标识的管理员用户,我有:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(
* fields={"email"},
* message="L'email que vous avez indiqué est déjà utilisé !"
* )
*/
class User implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Email()
*/
private $email;
/**
* @ORM\Column(type="string", length=255)
*/
private $username;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Length(min="8", minMessage="Votre mot de passe doit faire au minimum {{limit}} caractères")
*/
private $password;
/**
* @Assert\EqualTo(propertyPath="password", message="Vous n'avez pas tapé le même mot de passe")
*/
public $confirm_password;
public function getId(): ?int
{
return $this->id;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function getUsername(): ?string
{
return $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
public function eraseCredentials() {}
public function getSalt() {}
public function getRoles() {
return ['ROLE_ADMIN'];
}
数据不会持久化,因为您不会将其持久化到任何地方。您只在控制器中呈现表单,但没有负责将数据保存在数据库中的代码
首先,您需要构建表单。您应该创建单独的类(例如UserType),负责呈现表单中的字段。您可以阅读有关构建表单的内容,在底部可以看到如何创建我上面提到的表单类型类
其次,您应该使用EntityManager来持久化用户数据并将其刷新到数据库中。现在你没有代码来负责这个。您可以阅读有关在Symfony应用程序中创建简单注册表的内容
控制器动作示例:
/**
* @Route("/connexion", name="security_login")
*/
public function login()
{
$user = $this->get('user_factory')->create();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isValid()) {
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
$this->addFlash(FlashType::SUCCESS, 'Account was created');
return $this->redirectToRoute('homepage');
}
return $this->render('admin/login.html.twig', [
'form' => $form->createView(),
]);
}
用于登录路由的路径(即/connexion
)不在您尝试验证用户身份的防火墙后面。最简单的解决方案是删除主
防火墙的模式
选项,因为您实际上不需要多个防火墙,main
可以处理所有请求(除了dev
防火墙排除的开发工具的请求).那么,为什么您自己构建整个身份验证过程而对Symfony一无所知呢?您是否遵循登录表单中的“已创建帐户”这一官方信息?真正地此外,这不是处理Symfony中登录的方式。。。一点也不接近。
<form action="{{ path('security_login') }}" method="post">
<div class="form-group">
<input type="email" class="form-control" placeholder="Adresse mail" required name="_username">
</div>
<div class="form-group">
<input type="password" class="form-control" placeholder="Mot de passe" required name="_password">
</div>
<div class="form-group">
<button type="submit" class="btn btn-success">Connexion</button>
</div>
</form>
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(
* fields={"email"},
* message="L'email que vous avez indiqué est déjà utilisé !"
* )
*/
class User implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Email()
*/
private $email;
/**
* @ORM\Column(type="string", length=255)
*/
private $username;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Length(min="8", minMessage="Votre mot de passe doit faire au minimum {{limit}} caractères")
*/
private $password;
/**
* @Assert\EqualTo(propertyPath="password", message="Vous n'avez pas tapé le même mot de passe")
*/
public $confirm_password;
public function getId(): ?int
{
return $this->id;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function getUsername(): ?string
{
return $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
public function eraseCredentials() {}
public function getSalt() {}
public function getRoles() {
return ['ROLE_ADMIN'];
}
/**
* @Route("/connexion", name="security_login")
*/
public function login()
{
$user = $this->get('user_factory')->create();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isValid()) {
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
$this->addFlash(FlashType::SUCCESS, 'Account was created');
return $this->redirectToRoute('homepage');
}
return $this->render('admin/login.html.twig', [
'form' => $form->createView(),
]);
}