2013-01-10 57 views
5

我一直在尝试使用Symfony2创建登录表单,用户可以使用他们的电子邮件地址和密码登录。我遇到了很多问题,并最终意识到,只有在我的AdminUser实体类中有$username属性时,它才会起作用。我试图在可能的情况下使用电子邮件而不是用户名,所以有人可以解释为什么$username是必需的或我出错的地方?另外,在我的login.html.twig文件中,如果这有什么区别,我仍然使用_username而不是_email?我的代码如下(我已经删除了一些干将,哪些是不适用的制定者):Symfony2身份验证/使用电子邮件登录而不是用户名

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:假 表达式: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

您必须在AdminUser中有一个getUsername()方法才能满足用户界面要求。但它可以像你一样返回电子邮件。该属性:电子邮件应该是你所要做的。你可以查看EntityUserProvider类来验证发生了什么。也许从全新安装开始?有时候我会在解决问题时把事情弄糟。 – Cerad

回答

0

这是有点hackish的,但你可以从你的报名表删除用户名领域,用户的实体,这样做:

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

是的,我想,但我试图学习最佳实践,并防止太多黑客攻击。我确实找到了这个页面 - http://symfony.com/doc/current/cookbook/security/entity_provider.html#authenticating-someone-with-a-custom-entity-provider我需要创建一个AdminUserRepository吗? – user1961082

8

我想你应该用电子邮件改变属性,你也可以改变你想什么_username参数:

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

firewalls 
    form_login: 
     username_parameter: _username 

可能是你应该看看security configuration document

+1

适用于我,由于UserInterface接口,唯一的“片”留下了它的getUsername()方法。 – Cesar

+1

在securty.yml下工作 - > firewalls - > main - > form_login: - > username_parameter:电子邮件和corse输入名称='email' –

+0

更多信息http://symfony.com/doc/2.3/reference/configuration/security .html –

0

尝试并使用FOSUserBundle

它有一个默认feature用户可以用他们的用户名或电子邮件字段登录。

+3

FOSUserBundle不允许通过电子邮件登录。它只允许用户名,如果配置了用户名或电子邮件。只是觉得我会向那些寻求这个问题的答案的人明确表达。 – Twifty

+0

如果问题是关于实现用户认证的不同方式,这将是一个有效的答案。但用户的问题与提到的捆绑无关。 –

1
firewalls: 
main: 
    form_login: 
    username_parameter: _email 

你所有的代码都是正确的,你只需要在security.yml文件中做一点改动即可。只需添加username_parameter即可。

相关问题