私はプロジェクトにSymfonyを使用しており、過去2日間、ログインをプロダクションサーバーで機能させようとしましたが、成功しませんでした。エラーが発生し続ける
システムの問題により、認証要求を処理できませんでした。
私はここのガイド( http://symfony.com/doc/current/cookbook/security/entity_provider.html )に従って、データベースからのユーザーのロードを設定しました。
私のsecurity.ymlファイル:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
Acceptme\UserBundle\Entity\User: plaintext
role_hierarchy:
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
in_memory:
memory:
users:
patricia:
password: patricia
roles: 'ROLE_ADMIN'
users:
name: user_provider
entity: { class: AcceptmeUserBundle:User, property: username }
firewalls:
user_area:
pattern: ^/
anonymous: ~
provider: user_provider
form_login:
login_path: login_route
check_path: _login_check
default_target_path: homepage
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
default:
anonymous: ~
http_basic: ~
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
私SecurityController.php:
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Security\Core\SecurityContext;
class SecurityController extends Controller
{
/**
* @Route("/login", name="login_route")
* @Template("security/login.html.twig")
*/
public function loginAction(Request $request)
{
if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
$error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
} else {
$error = $request->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
}
return array(
'last_username' => $request->getSession()->get(SecurityContext::LAST_USERNAME),
'error' => $error,
);
}
/**
* @Route("/login_check", name="_login_check")
*/
public function securityCheckAction()
{
// this controller will not be executed,
// as the route is handled by the Security system
}
}
2つの異なるWebホスト(FatCowとGoDaddy)にプロジェクトをアップロードしてみましたが、問題は解決しません。ローカルでPHP 5.4.19を使用しています(FatCowは5.3.2を使用し、GoDaddyは5.4.37を使用しています)。XAMPPでlocalhostを操作する場合、すべてが正常に機能することに注意してください!
どちらの場合もPDOが有効になっていることを確認しました。 parameters.ymlファイルでデータベースのユーザー名、パスワード、ホストが正しいことを確認しました。ローカルサーバーとリモートサーバーの両方のエラーログには何も表示されません。
私はこの以前の投稿からすべての指示に従いました Deploying Symfony2 app getting fosuserbundle errors であり、それでも成功しません。
事前にすべての助けに感謝します。
更新:問題は解決しました。問題は、エンティティphpファイルのテーブルに大文字の名前が付けられ、データベーステーブルには小文字の名前が付けられることでした。正しい方向を示すためのClémentBERTILLONへの+1、つまりprod.log
エラーのようです:
システムの問題により、認証要求を処理できませんでした。
汎用的すぎて、どこに問題があるのかはわかりません(この問題について未解決の問題があります here )。
ログをチェックして何が起こったかを確認することで問題を解決しました(var/logs/dev.log
)、これが誰かの役に立つことを願っています。
私の特定のケースでは、parameters.ymlにデータベース接続に関する誤ったパラメーターがありました。ただし、繰り返しになりますが、エラーは一般的すぎるため、問題がデータベース接続に関連しているとは限りません。
この問題は、実行中のコマンドを修正することができます:php bin/console cache:clear --env=prod --no-debug
私の場合、ユーザーエンティティを変更した後、テーブルを更新するのを忘れました。
テーブル更新の場合:
php bin/console doctrine:schema:update --force
AS @ShinDarthが言及しています。それはあまりにも一般的であり、ログ検査は私たちのケースの人々がこれを乗り越えるのを助けるでしょう。
それが私の状況で役立つ場合、それは:
SF3にSonataUserBundleをインストールした後、私は
bin/console doctrine:schema:update --force
私のコンテキストは特別です。SonataUserBundleをインストールする前に、FOSUserBundleをすでにインストールして使用していました。 (SF3はFOSUser/SonataUSerと互換性があるため...データベースはその後16クエリを取得しました。
このソリューションは私にとって正しいです: https://stackoverflow.com/a/39782535/240037
ただし、ターミナルにアクセスできない場合は、サーバーに入り、var/cache
内のフォルダーを削除できます。
コンソールにアクセスできる別の解決策は、
#rm -rf var/cache/*
または
$Sudo rm -rf var/cache/*
このソリューションはsymfony 3で動作します
このエラーは一般的すぎると思います。私の場合、以下は正しくありません:
class: App/Entity/User;
補正:
class: App\Entity\User;
現在、Symfonyにバグがあり、認証中に本番IFでシステムエラーが発生します(テーブルの欠落、列の欠落、またはその他の例外)-ERRORではなくINFOとしてログに記録され、デフォルトのエラーログオプションではまったくログに記録されません。
https://github.com/symfony/symfony/pull/28462
現在、2つのオプションがあると思います。本当のエラーが見つかるまで、本番環境で(INFOを含む)すべてを一時的にログに記録します。
2番目のオプション:このパッチを使用するか、本番環境で直接デバッグします。
私の場合、問題は.env
ファイルの接続の詳細のタイプミスを修正することで修正されました。
別の考えられる原因はMySQL Serverです。私の場合、開始するのを忘れたMAMP/MySQL Serverで、Symfonyがこのメッセージを表示しました。
あなたはおそらくSymfony docs here によって与えられたテンプレートを使用しました:
{% if error %}
<div class="alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
これにより、実際にこのエラーメッセージが表示されます。この問題を修正する最も簡単で信頼できる方法は、この行を次のように置き換えることです。
<div class="alert alert-danger">{{ error }}</div>
これにより、エラーの完全なスタックトレースが得られ、(できれば)アプリケーションのデバッグに役立ちます。本番環境に移行する前に、これを元に戻すことを忘れないでください!