6

今日、Symfony2 を使用して、ユーザーがメール アドレスとパスワードを使用してログインできるログイン フォームを作成しようとしています。私は多くの問題を抱えていましたが、最終的には、エンティティ クラス$usernameにプロパティがある場合にのみ機能することに気付きました。AdminUser可能な限りユーザー名の代わりに電子メールを使用しようとしましたが、なぜ$username必要なのか、どこが間違っているのか誰か説明してもらえますか? また、私のlogin.html.twigファイルでは、それが違いを生むの_usernameではなく、まだ使用し_emailていますか? 私のコードは以下のとおりです (該当しないゲッターとセッターをいくつか削除しました):

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 } 
4

4 に答える 4

12

メールでプロパティを変更する必要があると思います。また、 _username パラメータを次の方法で変更できます。

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

firewalls
    form_login:
        username_parameter: _username

セキュリティ構成ドキュメントを確認する必要があるかもしれません

于 2013-03-05T16:16:02.817 に答える
2
firewalls:
 main:
  form_login: 
    username_parameter: _email

security.yml ファイルを少し変更するだけで、すべてのコードが正しくなります。username_parameter を追加するだけです。

于 2015-02-17T04:52:59.287 に答える
0

FOSUserBundleを試して使用してください。

ユーザーがユーザー名または電子メールフィールドでログインできるようにするためのデフォルト機能があります。

于 2013-03-05T16:33:27.587 に答える
0

これはちょっとハックですが、登録フォームからユーザー名フィールドを削除し、ユーザー エンティティで次のようにします。

public function setEmail($email) 
{
    $this->email = $email;
    $this->username = $email;
}
于 2013-01-10T22:54:48.627 に答える