部署 Symfony2 应用程序出现 fosuserbundle 错误

Deploying Symfony2 app getting fosuserbundle errors

我在另一台具有相同规格的计算机上安装了我的 Symfony 项目,当我使用 fosuserbundle 登录时收到以下错误:

Authentication request could not be processed due to a system problem.

我在 app/logs 文件中找不到任何感兴趣的内容。我 运行 应用处于开发模式。手动和从控制台清除缓存。我用 doctrine:database:create 设置了数据库。它可以使用 fos:user:create 创建一个新用户并成功保存到数据库中。

我不知道从这里去哪里。

您可能在 parameters.yml 中设置了错误的密码,因此它可能无法连接到数据库。 当应用程序无法连接到数据库以检查用户是否真实时,会发生上述错误。 (我也遇到了同样的错误,这是我的问题,希望对你有帮助)

检查以确保您的数据库是最新的。当我收到此错误时,这解决了我的问题。

php app/console doctrine:schema:update --dump-sql

编辑:拼写

在开发环境中工作时遇到同样的问题。我更新了我的用户模型,每次我尝试登录时都会遇到您的错误。由 运行 解决:

app/console cache:clear

编辑:再次遇到同样的问题。这次发生这种情况是因为我将我的项目移至另一台服务器并忘记更新 parameters.yml 以匹配服务器的 MySQL 凭据。

在部署过程中,通常是环境问题(假设该应用程序在开发站中运行良好)。 FOSUserBundle 它很棒,但由于某些原因,它并没有很好地显示它背后的问题。

如错误消息所述:“.. 由于 系统问题 ,无法处理。”

如果清理缓存或更新模式都有效,我建议尝试绕过 FOSUserBundle(通常问题出在您的 code/configuration 和服务器环境之间)并让您的包与默认的错误处理程序和记录器通知有什么问题。

就我而言,这是一个驱动程序问题。 (安装 pdo)

要绕过它,最简单的方法是在 security.yml

中删除 controller_action 的安全性
access_control:
{ path: ^/SomeCRUD, role: IS_AUTHENTICATED_ANONYMOUSLY }

然后,如果您访问它,它应该能够记录问题并且您应该能够修复它。

希望对您有所帮助

确保您的用户实体实现了 UserInterface

<?php

namespace UserBundle\Entity;

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

/**
 * BaseUser
 */
class BaseUser implements UserInterface
{
    /**
     * @var integer
     */
    protected $id;

    /**
     * @var string
     */
    protected $name;

    /**
     * @var string
     */
    protected $username;

    /**
     * @var string
     */
    protected $password;

    /**
     * @var string
     */ 
    protected $email;

    /**
     * @var string
     * 
     */
    protected $roles;

    /**
     * @var boolean
     */
    protected $isActive;


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

    /**
     * Set name
     *
     * @param string $name
     * @return BaseUser
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

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

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

        return $this;
    }

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

    /**
     * Set password
     *
     * @param string $password
     * @return BaseUser
     */
    public function setPassword($password)
    {
        if (!is_null($password)) {
            $this->password = $password;
        }

        return $this;
    }

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

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

        return $this;
    }

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

    /**
     * Set roles
     *
     * 
     * @return BaseUser
     */
    public function setRoles($roles)
    {
        $this->roles = $roles;
    }

    /**
     * Get roles
     */
    public function getRoles()
    {
        // Do what ever make sense to you here 
        return explode("|", $this->roles)
    }

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

        return $this;
    }

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

    public function eraseCredentials()
    {
    }

    public function getSalt()
    {
        return null;
    }
}

如果您使用 doctrine:database:create 生成了数据库,那么您的字符集可能不合适。因为用户 table 有一个序列化字段(角色),编码错误可能是原因。

您可以查看 app/logs 和您的数据库整理。

或者,检查

我遇到了同样的问题。我能够使用 php app/console doctrine:schema:update --force; php app/console doctrine:fixtures:load; 构建和填充数据库,但是 symfony 应用程序无法访问数据库。

问题是我在 parameters.yml 中设置了 database_host: 127.0.0.1,但 mysql 期望我通过 localhost 连接。更新 parameters.yml 解决了这个问题。我仍然对命令行的工作原理感到困惑...

我遇到了完全相同的问题。我采取的步骤如下:

  1. 我清除了缓存
  2. 我关闭了所有数据库表并通过迁移重新创建了它们
  3. 我将实体注释中使用单引号 (') 的位置替换为双引号 (") 作为约束方法的参数

    例子

    //src/SomeBundle/Model/user.php
    <?php
    /**
    *
    * @Assert\File(
    *  maxSize='512k',
    *  mimeTypes={'image/png', 'image/jpeg', 'image/gif'},
    *  mimeTypesMessage= 'Please upload a valid png, gif or jpeg file below 512Kb'
    * )
    */
    private $profilePic;
    
    ?>
    

    这被替换为

    <?php
    /**
    *
    * @Assert\File(
    *  maxSize="512k",
    *  mimeTypes={"image/png", "image/jpeg", "image/gif"},
    *  mimeTypesMessage= "Please upload a valid png, gif or jpeg file below 512Kb"
    * )
    */
    private $profilePic;
    ?>
    

完成后,我再次尝试验证,成功了!

我遇到了 Symfony 2.3 的问题,当我执行 app/console doctrine:schema:update --dump-sql 这就是结果。

删除索引 UNIQ_957A647992FC23A8 打开 fos_user; 删除索引 UNIQ_957A6479A0D96FBF ON fos_user; ALTER TABLE fos_user DROP 用户名,DROP username_canonical,DROP 电子邮件,DROP email_canonical,DROP 启用,DROP salt,DROP 密码,DROP last_login,DROP 锁定, DROP 已过期,DROP expires_at,DROP confirmation_token,DROP password_requested_at,DROP 角色,DROP credentials_expired,DROP credentials_expire_at;

在我将 doctrine-bundle 从 1.2 更新到 1.3 后它又开始工作了。

信息:

https://github.com/FriendsOfSymfony/FOSUserBundle/issues/2140

看起来是错误:

Authentication request could not be processed due to a system problem.

太笼统了,没有说明问题出在哪里(关于此事已打开一个问题here)。

我通过检查日志并查看发生了什么(在 var/logs/dev.log 中)解决了我的问题,希望这对某人有所帮助。

在我的具体情况下,parameters.yml 中关于数据库的参数有误。