【问题标题】:How create authentication in Symfony 3.2如何在 Symfony 3.2 中创建身份验证
【发布时间】:2017-02-01 09:49:04
【问题描述】:

我不知道,如何在 Symfony 3.2 中创建身份验证

我想从数据库加载安全用户。我在我的项目中使用了 msyql。

我的 security.yml:

# app/config/security.yml
security:
 encoders:
    Delivery\AdminBundle\Entity\User:
        algorithm: bcrypt

 providers:
    our_db_provider:
        entity:
            class: DeliveryAdminBundle:User
            property: username

 access_control:
    - { path: ^/admin, roles: ROLE_USER }

 firewalls:
    main:
        pattern:    ^/admin
        http_basic: ~
        provider: our_db_provider

用户.php:

    <?php
namespace Delivery\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Table(name="app_users")
 * @ORM\Entity(repositoryClass="Delivery\AdminBundle\Repository\UserRepository")
 */
class User implements UserInterface, \Serializable
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=25, unique=true)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=64)
     */
    private $password;

    /**
     * @ORM\Column(type="string", length=60, unique=true)
     */
    private $email;

    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    private $isActive;

    public function __construct()
    {
        $this->isActive = true;
        // may not be needed, see section on salt below
        // $this->salt = md5(uniqid(null, true));
    }

    public function getUsername()
    {
        return $this->username;
    }

    public function getSalt()
    {
        // you *may* need a real salt depending on your encoder
        // see section on salt below
        return null;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function getRoles()
    {
        return array('ROLE_USER');
    }

    public function eraseCredentials()
    {
    }

    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt,
        ));
    }

    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt
        ) = unserialize($serialized);
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set username
     *
     * @param string $username
     *
     * @return User
     */
    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    /**
     * Set password
     *
     * @param string $password
     *
     * @return User
     */
    public function setPassword($password)
    {
        if ($password) {
            $this->password = password_hash($password, PASSWORD_DEFAULT);
        }

        return $this;
    }

    /**
     * Set email
     *
     * @param string $email
     *
     * @return User
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set isActive
     *
     * @param boolean $isActive
     *
     * @return User
     */
    public function setIsActive($isActive)
    {
        $this->isActive = $isActive;

        return $this;
    }

    /**
     * Get isActive
     *
     * @return boolean
     */
    public function getIsActive()
    {
        return $this->isActive;
    }
}

登录数据库管理员,密码管理员($2a$08$jHZj/wJfcVKlIwr5AvR78euJxYK7Ku5kURNhNx.7.CSIJ3Pq6LEPC)

帮助!)

【问题讨论】:

  • DeliveryAdminBundle:User 应该是 Delivery:AdminBundle:User
  • 问题没有解决
  • 所以返回了一些错误或者只是用户未通过身份验证?您是如何将用户添加到数据库的?
  • 用户未通过身份验证。我在mysql中手动添加
  • 你能发布你的 UserRepository 的代码吗?

标签: php authentication symfony


【解决方案1】:

我下载了你的项目,查看了它,问题出在几个方面:

1) 您已经在 DeliveryAdminBundle -> SecurityController 中定义了自己的登录操作,并在相应视图中定义了登录表单,因此您必须在安全配置中配置 form_login 并省略 http_basic 才能使其工作。

在您的 App\Config\security.yml 中修改您的防火墙 -> 主要部分为:

    pattern: ^/admin
    provider: our_db_provider
    anonymous: ~
    form_login:
      login_path: _security_login      #login route
      check_path: _security_check      #credentials check route
      failure_path: _security_login    #failed login route
      default_target_path: a_home      #successfull login route
    logout:
      path: _security_logout           #logout route
      target: f_home                   #route to redirect after logout

2) 因为您在 DeliveryAdminBundle 下有您的安全配置,所以您必须修改 App\Config\routing.yml 以使登录/注销路由正常工作。

...
security_conf:
    resource: "@DeliveryAdminBundle/Resources/config/routing/security.yml"
    prefix:   /admin

3) 因为在第 2 步之后,您的登录路径将指向 ../admin/login,所以您必须让未经身份验证的用户可以访问它才能让他们登录。所以在您的 App\Config\security.yml 中修改access_control 部分:

access_control:
  - { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/admin, roles: ROLE_USER }

4) Symfony 登录表单字段的默认名称是 _username_password,因此请修改您的 AdminBundle\Resources\views\Security\login.html.twig 或更改 security.yml 中的默认表单字段名称

如上所述,您的编码器和提供程序配置非常好,我的第一条评论有误。我对 Delivery\AdminBundle 命名空间感到困惑,但显然你有一个名为 DeliveryAdminBundle 的包。这有点令人困惑,我会建议您使用不同的命名策略,但这取决于您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2019-09-20
    • 2014-10-21
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多