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

默认情况下,语言是法语,但我启用了“en”

我安装了这个捆绑包,大多数事情都很好。

但我想做以下事情:

  • 用户 XXX (SonataUserBundle) 在“locale”字段中具有值“en”
  • 当该用户登录时,我想以英文显示页面。
  • 用户不必手动切换。

我认为这应该在认证过程中完成。

问题是 SonataUserBundle(基于 FOSUser)不进行身份验证(见这里

所以我尝试这样做但肯定有一些配置问题。

将 wsse_secured 应用于整个站点时:

wsse_secured:
    pattern:   ^/
    wsse:      true

我收到以下错误:在 SecurityContext 中找不到令牌。

将匿名添加到我的 config.yml 时:

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

我可以访问主页,但是在尝试登录时出现此错误: 您必须在安全防火墙配置中使用 form_login 配置要由防火墙处理的检查路径。

为 FOS 添加检查路径时,它可以工作,但系统不能与我的 wsse-provider 一起工作(我在 WsseProvider.php 中添加了代码让我知道)

所以我的问题是:我怎样才能得到这个 WSSE 身份验证的工作。我严格按照文档中的指示进行操作。

编辑 :

我可能通过在自己的包中实现 wsse 安全文件而犯了错误。现在我把它移到奏鸣曲用户包,我得到以下错误:

ErrorException:可捕获的致命错误:传递给 Application\Sonata\UserBundle\Security\Authentication\Provider\WsseProvider::__construct() 的参数 1 必须实现接口 Symfony\Component\Security\Core\User\UserProviderInterface,给定字符串,在..中调用\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 回答