2012-11-11 233 views
2
  • Symfony的2.1.3-dev的
  • SonataUserBundle
  • SonataAdminBundle
  • JMSI18nRoutingBundle

默認情況下的語言是法語,但我啓用 「EN」更改語言

我安裝了這個軟件包,大部分工作都正常。

但我想做到以下幾點:

  • 用戶XXX(SonataUserBundle)已在該領域「區域設置」值「恩」
  • 當我這個用戶登錄希望現身英文頁面。
  • 用戶沒有手動切換。

我認爲這應該在autentification過程中完成。

的問題是,SonataUserBundle(基於FOSU​​ser)不做認證(看到HERE

於是,我就做THIS,但必須有一些配置問題。

當應用wsse_secured整個網站:

wsse_secured: 
    pattern: ^/ 
    wsse:  true 

我得到以下錯誤:令牌未在SecurityContext中找到。

當添加匿名我config.yml:

firewalls: 
    .... 
    main: 
     pattern: ^/ 
     wsse:  true 
     anonymous:  true 

我可以訪問主頁,但嘗試登錄時,我得到這個錯誤: 您必須配置支票路徑被處理防火牆在您的安全防火牆配置中使用form_login。

當添加了它的工作原理,但系統不與我WSSE提供商合作FOS的的CheckPath(我在WsseProvider.php添加的代碼,讓我知道)

所以我的問題:我怎樣才能找到工作這個WSSE認證。我嚴格遵循文檔中的指示。

編輯:

我也許是在我自己的捆綁實現WSSE安全文件犯了一個錯誤。 現在我把它移到奏鳴曲用戶捆綁,我得到以下錯誤:

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 on line 4413 and defined in ..\src\Application\Sonata\UserBundle\Security\Authentication\Provider\WsseProvider.php line 17

這有什麼錯我的WsseProvider UserProviderInterface。PHP:

<?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; 
    } 
... 

回答

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 /演示/資源/ service.yml:

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

其他解決方案,我已找到:Here