10

我设置了我的安全设置来保护根路径下的所有内容/,除了公共页面以查看隐私政策,/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

4 回答 4

9

如果您的所有语言环境都是 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' }
于 2013-11-05T12:58:59.823 回答
8

我设法解决了这样的问题

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 }

但我认为这不会奏效。

于 2013-11-05T12:35:44.887 回答
8

现在(从 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 }
于 2020-03-30T12:11:09.787 回答
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 }
于 2016-06-27T08:00:24.283 回答