Tôi đã cố gắng tạo biểu mẫu đăng nhập ngay hôm nay bằng cách sử dụng Symfony2 nơi người dùng có thể đăng nhập bằng địa chỉ email và mật khẩu của họ. Tôi đã có rất nhiều vấn đề và cuối cùng nhận ra nó sẽ chỉ hoạt động nếu tôi có một tài sản $username
trong lớp thực thể AdminUser
của tôi. Tôi đã cố gắng sử dụng email thay vì tên người dùng nếu có thể để ai đó có thể vui lòng giải thích lý do tại sao $username
là bắt buộc hoặc nơi tôi đã đi sai? Ngoài ra, trong tệp login.html.twig
của tôi, tôi vẫn đang sử dụng _username
thay vì _email
nếu điều đó có khác biệt gì không? Mã của tôi là dưới đây (tôi đã xóa một số getter và setter mà không được áp dụng):Xác thực/đăng nhập Symfony2 bằng email thay vì tên người dùng
AdminUser Entity:
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;
}
}
tập tin security.yml
của tôi là:
jms_security_extra: secure_all_services: false biểu thức: 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 }
Bạn phải có phương thức getUsername() trong AdminUser chỉ để đáp ứng yêu cầu giao diện người dùng. Nhưng nó có thể trả lại email như bạn có nó. Tài sản: email phải là tất cả những gì bạn phải làm. Bạn có thể nhìn vào lớp EntityUserProvider chỉ để xác minh những gì đang xảy ra. Có thể bắt đầu với một cài đặt mới? Đôi khi tôi làm rối tung mọi thứ trong khi chụp ảnh. – Cerad