2
  • 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;
    }
...
4

1 に答える 1

2

シンプルな KernelRequestListener でこの問題を解決しました。

<?php
namespace ACME\DemoBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;


class RequestListener
{
protected $container;

public function __construct(ContainerInterface $container)
{
    $this->container = $container;
}

public function onKernelRequest(GetResponseEvent $event)
{
    $userlocale = null;
    $request = $event->getRequest();
    $user = $this->container->get('security.context')->getToken()->getUser();

    if (!is_object($user)) {
        return;
    }

    $userlocale = $user->getLocale();
    if($userlocale !== NULL AND $userlocale !== '')
    {
        $request->setLocale($userlocale);
    }
}
}

Acme/Demo/Resources/service.yml にサービスを登録します。

ACME.demo.listener.request:
      class: ACME\DemoBundle\Listener\RequestListener
      arguments: [ @service_container ]
      tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

私が見つけた他の解決策:ここ

于 2012-11-21T09:12:51.390 に答える