部署 Symfony2 应用程序得到 fosuserbundle 错误

Posted

技术标签:

【中文标题】部署 Symfony2 应用程序得到 fosuserbundle 错误【英文标题】:Deploying Symfony2 app getting fosuserbundle errors 【发布时间】:2015-03-24 00:10:25 【问题描述】:

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

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

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

我不知道从这里去哪里。

【问题讨论】:

webserver 的error.log 检查了吗? 您确定应用程序/日志文件不包含有用的内容吗? 对我来说这是数据库错误,在运行doctrine:shcema:update 后解决了:) 【参考方案1】:

看起来是这样的错误:

由于系统问题,无法处理身份验证请求。

太笼统了,没有说明问题出在哪里(有一个关于这个问题的问题here)。

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

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

【讨论】:

【参考方案2】:

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

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

编辑:拼写

【讨论】:

谢谢。由于数据库中没有完整的用户模式,它正在抛出消息。 非常感谢。这花费了我太多时间。【参考方案3】:

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

在 fos_user 上删除索引 UNIQ_957A647992FC23A8; 在 fos_user 上删除索引 UNIQ_957A6479A0D96FBF; ALTER TABLE fos_user DROP username, DROP username_canonical, DROP email, DROP email_canonical, DROP enabled, DROP salt, DROP password, DROP last_login, DROP locked, DROP expired, DROP expires_at, DROP confirm_token, DROP password_requested_at, DROP roles, DROP credentials_expired, DROP credentials_expire_at ;

在我将教义捆绑包从 1.2 更新到 1.3 之后,它又开始工作了。

信息:

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

【讨论】:

【参考方案4】:

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

    我清除了缓存 我关闭了所有数据库表,并通过迁移重新创建了它们

    我在实体注释中将单引号 (') 替换为双引号 (") 作为约束方法的参数

    示例

    //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;
    ?>
    

这样做后,我再次尝试了身份验证,它成功了!

【讨论】:

【参考方案5】:

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

app/console cache:clear

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

【讨论】:

我在哪里运行这些命令?我有同样的问题。但我找不到任何关于如何清除我的 EB 上的缓存文件的解决方案。 @TheGreenFox 打开你的终端;导航到 Symfony 的项目目录,然后是 app 子文件夹。在这里你会找到console 文件(它实际上是一个没有扩展名的php 文件)。在您的终端上输入php console cache:clear,这将清除“开发”环境的缓存(如果您在生产环境中,请运行php console cache:clear --env=prod)。【参考方案6】:

我遇到了同样的问题。我能够使用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 解决了这个问题。我仍然对为什么命令行的东西起作用感到困惑......

【讨论】:

【参考方案7】:

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

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

如果清理缓存或更新架构有效,我建议尝试绕过 FOSUserBundle(通常问题出在您的代码/配置和服务器环境之间)并让您的捆绑包使用默认的错误处理程序和记录器通知任何问题。

在我的情况下,这是一个驱动程序问题。 (安装 pdo)

要绕过它,最简单的方法是在 security.yml 中删除 controller_action 的安全性

access_control:
 path: ^/SomeCRUD, role: IS_AUTHENTICATED_ANONYMOUSLY 

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

希望对你有帮助

【讨论】:

嗯......它对我有用。我相信这个问题的目的是找出 FOSUserBundle 背后的“系统问题”是什么避免了登录过程,我只是告诉我我在部署中的经验,我在这个问题上遇到了同样的问题以及我的方式解决这个问题。很抱歉没有提供帮助。【参考方案8】:

如果您使用教义:数据库:创建生成数据库,则您的字符集可能不合适。因为 User 表有一个序列化的字段(角色),所以可能是错误的编码。

您可以查看应用程序/日志和您的数据库排序规则。

或者,检查this answer

【讨论】:

【参考方案9】:

确保您的用户实体实现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;
    

【讨论】:

【参考方案10】:

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

【讨论】:

以上是关于部署 Symfony2 应用程序得到 fosuserbundle 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony 3.1 中升级时,需要对 FOSUser 进行完全身份验证

Symfony2 实现 PATCH 方法来更新用户字段

如何在 Symfony2 中制作高级 ACL?

奏鸣曲 Sontauser 和 fosuser

sonata AdminBlockServiceInterface 弃用,以明确安装 symfony 2.8 + sonata 3.10

使用 Amazon Elastic Beanstalk 部署 symfony2.1 应用程序