如何将_locale参数添加到安全路径?

时间:2013-11-05 10:08:28

标签: security symfony internationalization routing authorization

我设置了我的安全设置,以保护根路径/下的所有内容,以便公共页面查看隐私政策/privacy。一切正常。

# security.yml
access_control:
    - { path: ^/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/,         role: ROLE_USER }

现在我在隐私政策页面添加了一些不同的翻译,以便路线从/privacy更改为/{_locale}/privacy。不幸的是,我无法将_locale参数添加到安全路径中,如下所示:

access_control:
    ...
    - { path: ^/{_locale}/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }

那么我该如何修改security.yml以便我可以将_locale添加到路径中并将其限制为预定义的语言,例如(en|fr|es|de)

4 个答案:

答案 0 :(得分:6)

我成功解决了这个问题

access_control:
    ...
    - { path: ^/(en|fr|es|de)/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }

对其他回答者的建议:我现在必须手动将此字符串(en|fr|de)输入所有路径。当我添加一种语言时,我必须在许多情况下修改这个字符串。如果可以定义一个字符串

会好得多
parameters:
    languages: "(en|fr|es|de)"

并在路线

中使用此功能
    - { path: ^/%languages%/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }

但我认为这不会奏效。

答案 1 :(得分:5)

如果你的所有语言环境都是2个字符的(en|fr|es|de|...),你可以使用更通用的正则表达式:

- { path: ^/[a-z]{2}/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }

这样,每次添加新语言区域时都不必触摸security.access_control

对于EN_en形式的区域设置,您可以使用类似这样的内容:

- { path: ^/[a-zA-Z]{2}_[a-zA-Z]{2}/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }

答案 2 :(得分:2)

现在(自Symfony 4.1或更高版本开始),您可以在一个地方定义语言环境,并在应用程序中的任何地方使用它

config/services.yaml中添加

parameters:
    myAppName.locales: en|fr|es|de

config/routes.yaml

cms:
    prefix:   /{_locale}/
    controller: App\Controller\DefaultController::index
    requirements:
        _locale: '%myAppName.locales%'

config/packages/security.yaml

security:
    ## .... no changes here
    access_control:
        - { path: ^/(%myAppName.locales%)/cms, roles: ROLE_ADMIN }

答案 3 :(得分:1)

我有同样的问题,我通过在防火墙设置中对我的安全区域中的模式进行一些更改来解决它。然后更新访问控制。代码在

之下
 firewalls:

    # disables authentication for assets and the profiler, adapt it according to your needs
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    admin_area:
        context: admin_area
        anonymous: ~
        pattern: ^/(en|ar)/admin/*
        form_login:
            login_path: admin_login
            check_path: admin_login
            default_target_path: admin_home
            provider: admins
        logout:
            path: admin_logout
            target: admin_login
下面的

是access_controll

    access_control:
    - { path: ^/(en|ar)/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(en|ar)/admin, roles: ROLE_ADMIN }
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }