2013-01-10 5 views
5

私は現在、ユーザが自分のメールアドレスとパスワードでログインできるSymfony2を使ってログインフォームを作成しようとしています。私は多くの問題を抱えており、AdminUserエンティティクラスに$usernameというプロパティがある場合にのみ機能します。可能であればユーザー名の代わりに電子メールを使用しようとしました。だから誰かがなぜ$usernameが必要なのか、どこが間違っているのか説明してください。また、私のlogin.html.twigファイルでは、もしそれが何か違いがあれば、私はまだ_emailよりも_usernameを使用していますか?私のコードは、(私は適用されませんいくつかのゲッターとセッターを削除しました)以下である: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: false 式: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()メソッドが必要です。しかし、それはあなたが持っているように電子メールを返すことができます。プロパティ:emailはあなたがしなければならないものでなければなりません。 EntityUserProviderクラスを調べるだけで何が起きているかを確認できます。新しいインストールから始めることがありますか?トラブルシューティング中に時々私は物事を混乱させる。 – Cerad

答えて

0

これはちょっとハックですが、あなたはあなたの登録フォームからユーザー名フィールドを削除し、ユーザー主体で、これを行うことができます:

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 

はあなたが01を見ている必要がありかもしれ

+1

私のために働く、唯一の "作品"は、UserInterfaceインターフェイスのためにgetUsername()メソッドを残しました。 – Cesar

+1

は、securty.yml - > firewalls - > main - > form_loginの下で動作します: - > username_parameter:電子メールとコーパスの入力名= '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を追加するだけです。