2013-01-10 18 views
5

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 } 
+0

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

Trả lời

0

Đây là kinda hackish, nhưng bạn có thể loại bỏ các lĩnh vực tên người dùng từ các hình thức đăng ký của bạn, và trong thực người dùng của bạn, làm điều này:

public function setEmail($email) 
{ 
    $this->email = $email; 
    $this->username = $email; 
} 
+1

Vâng, tôi cho rằng, tuy nhiên tôi đang cố gắng tìm hiểu các phương pháp hay nhất và ngăn chặn nhiều sự xâm nhập. Tôi đã tìm thấy trang này - http://symfony.com/doc/current/cookbook/security/entity_provider.html#authenticating-someone-with-a-custom-entity-provider tôi có phải tạo một AdminUserRepository không? – user1961082

8

Tôi đoán bạn nên thay đổi thuộc tính với email và bạn cũng có thể thay đổi tham số _username với bất cứ điều gì bạn muốn bằng cách:

entity: 
      entity: 
       class:    SecurityBundle:User 
       property:   username 

firewalls 
    form_login: 
     username_parameter: _username 

có thể bạn nên có một cái nhìn tại security configuration document

+1

hoạt động đối với tôi, phần "duy nhất" còn lại là phương thức getUsername() do giao diện UserInterface. – Cesar

+1

hoạt động dưới securty.yml -> tường lửa -> chính -> form_login: -> username_parameter: email và tên đầu vào corse = 'email' –

+0

thông tin thêm http://symfony.com/doc/2.3/reference/configuration/security .html –

0

Hãy thử và sử dụng FOSUserBundle.

Có mặc định feature để người dùng có thể đăng nhập bằng tên người dùng hoặc trường email của họ.

+3

FOSUserBundle không cho phép đăng nhập bằng email. Nó chỉ cho phép tên người dùng và nếu tên người dùng hoặc email được cấu hình. Chỉ nghĩ rằng tôi sẽ làm rõ điều đó với những người đang tìm kiếm câu trả lời cho câu hỏi này. – Twifty

+0

Nếu câu hỏi là về các cách khác nhau để thực hiện xác thực người dùng, đây sẽ là câu trả lời hợp lệ. Nhưng vấn đề của người dùng không liên quan đến gói được đề cập. –

1
firewalls: 
main: 
    form_login: 
    username_parameter: _email 

Tất cả mã của bạn là chính xác bạn chỉ cần thực hiện một chút thay đổi trong tệp security.yml. chỉ cần thêm username_parameter.

Các vấn đề liên quan