我今天尝试使用Symfony2创建一个登录表单,用户可以使用他们的电子邮件地址和密码进行登录。我遇到了许多问题,最终意识到只有在我的AdminUser实体类中有一个$username属性时才能正常工作。我已经尽可能地使用电子邮件代替用户名,所以请有人解释为什么需要$username或者我哪里做错了吗?此外,在我的login.html.twig文件中,我仍在使用_username而不是_email,是否有任何区别?下面是我的代码(我删除了一些不适用的getter和setter):
AdminUser实体:
namespace XXX\WebsiteBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;
/**
* AdminUser
*
* @ORM\Table(name="admin_user",indexes={@ORM\Index(name="indexes", columns={"deleted"})})
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class AdminUser implements UserInterface
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=45)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=45, unique=true)
*/
private $email;
/**
* @var string
*
* @ORM\Column(name="salt", type="string", length=255)
*/
private $salt;
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=255)
*/
private $password;
/**
* @var integer
*
* @ORM\Column(name="enabled", type="integer", options={"default" = 0})
*/
private $enabled;
/**
* @var string[] $roles
*
* @ORM\Column(name="roles", type="array")
*/
private $roles = array();
private $username;
/**
* Gets the username.
*
* @return string The username.
*/
public function getUsername()
{
return $this->email;
}
/**
* Erases the user credentials.
*/
public function eraseCredentials()
{
}
/**
* Returns the roles granted to the user.
*
* <code>
* public function getRoles()
* {
* return array('ROLE_USER');
* }
* </code>
*
* Alternatively, the roles might be stored on a ``roles`` property,
* and populated in any number of different ways when the user object
* is created.
*
* @return Role[] The user roles
*/
public function getRoles() {
return $this -> roles;
}
/**
* Set the roles of the user
*
* @var string[] $roles
*
* @return \XXX\WebsiteBundle\Entity\User this
*/
public function setRoles(array $roles) {
$this -> roles = $roles;
return $this;
}
}
我的security.yml
文件如下:
这个文件用于设置安全性相关的配置,其中jms_security_extra: secure_all_services: false expressions: true
jms_security_extra
是一个插件,在这个文件中,secure_all_services
设置为false表示不对所有服务进行安全控制,而expressions
设置为true则表示启用表达式语言来进行安全控制。security:
encoders:
XXX\WebsiteBundle\Entity\AdminUser: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
main_provider:
entity: { class: XXX\WebsiteBundle\Entity\AdminUser, property: email }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin_firewall:
pattern: ^/admin.*
anonymous: ~
form_login:
login_path: /admin/login
check_path: /admin/login_check
access_control:
- { path: ^/admin/login.*, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin.*, roles: ROLE_ADMIN }