- Symfony 2.1.3-dev
- SonataUserBundle
- SonataAdminBundle
- JMSI18nRoutingBundle
デフォルトではフランス語ですが、「en」を有効にしました
このバンドルをインストールしましたが、ほとんどのものが正常に動作します。
しかし、私は次のことをしたいと思います:
- ユーザー XXX (SonataUserBundle) のフィールド "locale" の値は "en" です。
- このユーザーがログインすると、ページを英語で表示したいと考えています。
- ユーザーが手動で切り替える必要はありません。
これは、認証プロセスで行う必要があると思います。
問題は、SonataUserBundle (FOSUser に基づく) が認証を行わないことです (こちらを参照) 。
だから私はこれをやろうとしましたが、設定の問題がいくつかあるはずです。
wsse_secured をサイト全体に適用する場合:
wsse_secured:
pattern: ^/
wsse: true
次のエラーが表示されます: SecurityContext にトークンが見つかりませんでした。
anonymous を config.yml に追加する場合:
firewalls:
....
main:
pattern: ^/
wsse: true
anonymous: true
ホームページにアクセスできますが、ログインしようとすると次のエラーが表示されます: セキュリティ ファイアウォール構成で form_login を使用して、チェック パスをファイアウォールで処理するように構成する必要があります。
FOS のチェックパスを追加すると機能しますが、システムは wsse-provider で機能しません (WsseProvider.php にコードを追加して確認しました)
だから私の質問:このWSSE認証をどのように機能させることができますか。ドキュメントの指示に厳密に従いました。
編集 :
自分のバンドルに wsse セキュリティ ファイルを実装したことでエラーが発生した可能性があります。今、それをsonataユーザーバンドルに移動しましたが、次のエラーが発生しました:
ErrorException: Catchable Fatal Error: Argument 1 passed to Application\Sonata\UserBundle\Security\Authentication\Provider\WsseProvider::__construct() must implement interface Symfony\Component\Security\Core\User\UserProviderInterface, string given, called in .. \app\cache\dev\appDevDebugProjectContainer.php 行 4413 および ..\src\Application\Sonata\UserBundle\Security\Authentication\Provider\WsseProvider.php 行 17 で定義
WsseProvider.php の UserProviderInterface の問題点:
<?php
namespace Application\Sonata\UserBundle\Security\Authentication\Provider;
use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\NonceExpiredException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Application\Sonata\UserBundle\Security\Authentication\Token\WsseUserToken;
class WsseProvider implements AuthenticationProviderInterface
{
private $userProvider;
private $cacheDir;
public function __construct(UserProviderInterface $userProvider, $cacheDir)
{
$this->userProvider = $userProvider;
$this->cacheDir = $cacheDir;
}
...