Silex 2:带语言环境的安全防火墙错误(Silex SecurityServiceProvider + Pmaxs \ LocaleServiceProvider)

时间:2018-03-12 13:47:00

标签: php symfony frameworks silex

我看到了this solution,但我无法让它发挥作用......

所以这是我的代码,我尝试过的以及我得到的内容:

我的代码

1 /我的安全提供商:

$app->register(new Silex\Provider\SessionServiceProvider());
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'secured' => array(
            'pattern' => '^/',
            'anonymous' => true,
            'logout' => true,
            'form' => array(
                'login_path' => '/login',
                'check_path' => '/login_check'),
            'users' => function () use ($app) {
                return new Myapp\DAO\UserDAO($app['db']);
            },
        ),
    ),
));

2 /我的翻译提供商

我使用:https://github.com/pmaxs/silex-locale

$app->register(new Silex\Provider\TranslationServiceProvider());
$app->register(new \Pmaxs\Silex\Locale\Provider\LocaleServiceProvider(), [
    'locale.locales' => ['en', 'fr'],
    'locale.default_locale' => 'en',
    'locale.resolve_by_host' => false,
    'locale.exclude_routes' => ['^_']
]);
$app->register(new Silex\Provider\LocaleServiceProvider());

$app->extend('translator', function($translator, $app) {
    $translator->addLoader('yaml', new YamlFileLoader());
    // The translation file : one by langage, add new here
    $translator->addResource('yaml', __DIR__.'/../src/locales/en.yml', 'en');
    $translator->addResource('yaml', __DIR__.'/../src/locales/fr.yml', 'fr');

    return $translator;
});

这样我的路线就没有/{_locale}/,但在我/my-path/locale/my-path时仍然有效。

3 /我的登录控制器

$app->get('/login', function(Request $request) use ($app) {
    return $app['twig']->render('login.html.twig', array(
        'error'         => $app['security.last_error']($request),
        'last_username' => $app['session']->get('_security.last_username'),
    ));
})->bind('login');

我尝试了什么 - 我得到的错误

  • 当我的网址为/login时,它可以正常工作:我回到了我的主页页面。
  • 当我的网址为/fr/login时,它无效:我的网址变为/fr/login_check并向我发送了error 404(这是正常的,因为我没有此视图/页面网址,但不知道为什么它会尝试显示此页面并且不像以前那样连接我。)

所以我尝试在我的安全提供程序中更改此内容:

 'form' => array(
     'login_path' => '/login',
     'check_path' => '/{_locale}/login_check'),

它给了我一个error 500 : An exception has been thrown during the rendering of a template ("Unable to generate a URL for the named route "login_check" as such route does not exist.").

所以我回到了我的其他安全提供商(没有/{_locale}/)并按照我看到的解决方案中的建议更改了我的登录控制器:

$app->get('/{_locale}/login', function(Request $request) use ($app) {
    return $app['twig']->render('login.html.twig', array(
        'error'         => $app['security.last_error']($request),
        'last_username' => $app['session']->get('_security.last_username'),
    ));
})->bind('login');
  • 现在,当我尝试使用我的默认语言环境(en)进行登录时,我有这个网址/en/login并且它有效。
  • 当我尝试更改法语的语言时,我要使用此网址/fr/en/login登录,然后我在网址error 404上找回/fr/login_check

当我尝试通过网址/fr/my-page上的error 404/fr/logout进行注销时遇到同样的问题...

任何让Silex安全提供程序与pmaxs/silex-locale一起使用的想法

一位同事建议我留在" en"登录和注销(因为它工作),即使我的用户选择了其他语言。

你认为这是个好主意吗? (我不是百分之百,因为这样我无法翻译我的内容)

编辑:

由于我没有回答我的问题,我尝试检查我的两条路线/login_check/logout,看看我是否可以更改它们,你知道我在哪里可以找到它们吗?

然后,我尝试在进入这两条路线之前进行一些重定向,但不知道我该怎么做......这个想法:

// If I log from those URL, it works
/login
/en/login

// If I log from those, it doesn't works :
/fr/login
/fr/fr/login

// So from the URL that doesn't works, I'd like to do :
/fr/login ---> redirect to /login ---> execute code
/fr/fr/login ---> redirect to /en/login ---> execute code

/logout相同。 我是否可以这样做以及如何做?

结束编辑

PS:这是关于这个项目的另一个问题,我解释了如何允许用户在网站上更改语句:Silex : allow user to change langage by clicking on html element and keeping clean URL

1 个答案:

答案 0 :(得分:0)

我想我设法以这种方式解决了我的问题:

1 /当我有另一个区域设置而不是error 404时,为了躲避我登录和注销的en,我会在en和{{{{}}之前将用户重定向到check_path 1}}:

logout

这种方式有效但用户一直以英语回来,所以我必须在他的页面中重定向他,但使用相同的语言环境。

2 /所以我在会话中添加了选定的语言(如果我没有// The login form action <form role="form" action="{{ locale_generate('en', 'login_check') }}" method="post"> // The logout <a href="{{ locale_generate('en', 'logout') }}"> <span class="log">{{ 'logout'|trans }}</span></a> ,我使用我的默认语言环境作为值:$_SESSION['langue']

en

3 /然后我在注册SecurityProvider时更改了我的默认登录路径:

//===============================================
// My Ajax call where I send the selected langage value
//===============================================
$(".change_langue").on("click", function() {
    var new_langue = $(this).data("lg");

    $.ajax({
        url: "{{ path('new-langue') }}",
        type: 'POST',
        data: {'langue': new_langue},
        success: function (resp) {
            console.log(resp);
        },
        error: function (resp) {
            console.log(resp);
        }
    });
});

//========================================================
// My controller where I set the value in session
//========================================================
$app->post('/new-langue', function(Request $request) use ($app) {
    $new_langue = $request->get('langue');

    $app['session']->set('langue', $new_langue);
    $result['new_langue'] =  $app['session']->get('langue');

    return new Response(json_encode($result));

})->bind('new-langue');

4 /现在在我的新$app->register(new Silex\Provider\SecurityServiceProvider(), array( 'security.firewalls' => array( 'secured' => array( 'pattern' => '^/', 'anonymous' => true, 'form' => array( 'login_path' => 'login', 'check_path' => '/login_check', 'always_use_default_target_path' => true, // I add this line 'default_target_path' => '/login/redirect' // I add this line ), 'logout' => array( 'logout_path' => '/logout', 'invalidate_session' => true, ), 'users' => function () use ($app) { return new _mypixers_silex\DAO\UserDAO($app['db']); }, ), ), )); 控制器中,我检查/login/redirect值并重定向到正确的语言:

$_SESSION['langue']

这样,当我使用除//======================================================== // LOGIN REDIRECT //======================================================== $app->get('/login/redirect', function(Request $request) use ($app) { $session_langue = $app['session']->get('langue'); if (empty($session_langue)) { $session_langue = 'en'; } return $app->redirect($app['locale.url_generator']->generate($session_langue, 'pixers')); })->bind('login_redirect'); 之外的其他语言环境登录或注销并且用户保持当前语言时,我没有更多错误。

PS:我现在退出时仍然会回到英语,但我正在研究解决方案。我会在完成后编辑我的anwser