如何在security.yaml中动态引用locales配置多语言免认证路由
可复用locales参数的实现方案
不需要重复维护多份语言列表,后续新增支持语言时仅需修改locales参数一处即可,有两种落地成本极低的方案:
方案1:参数注入拼接正则(适配所有Symfony版本,改造成本最低)
先在参数配置中预生成语言匹配的正则片段,直接在access_control中引用即可,不用每次手动修改正则枚举值:
# services.yaml 中的parameters配置块 parameters: locale: 'de' locales: ['de', 'en'] # 拼接为正则的或匹配格式,新增语言时仅需修改上方locales数组,同步更新此处即可 locales_regex: 'de|en'
之后修改security配置中的access_control规则,直接引用预定义的正则参数:
# security.yaml access_control: - { path: ^/v1/(%locales_regex%)/translation, roles: IS_AUTHENTICATED_ANONYMOUSLY }
如果觉得手动维护locales_regex麻烦,可以借助Symfony的容器编译扩展,在容器加载阶段自动把locales数组implode为竖线分隔的字符串,完全不需要手动同步两个参数。
方案2:通过表达式动态校验(无需维护正则,灵活度最高)
放宽路径的正则匹配规则,通过allow_if配置直接校验请求携带的语言是否在合法locales列表内,完全不需要写语言枚举的正则:
# security.yaml access_control: - path: ^/v1/[^/]+/translation allow_if: "request.getLocale() in parameter('locales')" roles: IS_AUTHENTICATED_ANONYMOUSLY
如果你的路由已经给_locale参数配置了校验规则(要求必须匹配%locales%参数值),甚至可以省略allow_if的判断,因为不合法的locale请求会直接被路由层返回404,不会走到权限校验环节。路由配置参考:
# routes.yaml v1_translation: path: /v1/{_locale}/translation controller: App\Controller\TranslationController::get requirements: _locale: '%locales%' # 直接引用参数做路由合法性校验
注意:Symfony 6.0+版本中已经废弃了
IS_AUTHENTICATED_ANONYMOUSLY,替换为PUBLIC_ACCESS即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者nas
相关产品推荐
相关产品推荐

