2
votes
  • Symfony 2.1.3-dev
  • SonataUserBundle
  • SonataAdminBundle
  • JMSI18nRoutingBundle

By default the language is french, but I enabled "en"

I installed this bundles and most things work fine.

But I would like to do the following :

  • A user XXX (SonataUserBundle) has in the field "locale" the value "en"
  • When this user logs in I want to show up the pages in english.
  • The user has not to switch manually.

I think this should be done on the autentification process.

The problem is that SonataUserBundle (based on FOSUser) does not do the authentification (seen HERE)

So I tried to do THIS, but there must be some configuration issues.

When applying the wsse_secured to the whole site :

wsse_secured:
    pattern:   ^/
    wsse:      true

I get the following error : A Token was not found in the SecurityContext.

When adding anonymous to my config.yml :

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

I can access the home page, but when trying to login I get this error : You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.

When adding the checkpath for FOS it works but the systems does not work with my wsse-provider (I added code in WsseProvider.php to make me know)

So my question : How can I get work this WSSE authentification. I followed strictly the indications in the doc.

EDIT :

I perhaps made an error by implementing the wsse security files in my own bundle. Now I moved it to sonata user bundle and I get the following error :

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

What's wrong with my UserProviderInterface in WsseProvider.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;
    }
...
1

1 Answers

2
votes

I've solve this problem with a simple 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);
    }
}
}

Register service in 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 }

Other solution I've found there: Here