как защитить приложение по среде в symfony?

я сделал

apps/frontend/config/security.yml

dev:
 default:
  is_secure: false

prod:
 default:
  is_secure: true

но он не работает, я что-то пропустил?


person belaz    schedule 21.02.2010    source источник


Ответы (2)


Как говорит Стив, is_secure нельзя настроить для каждой среды отдельно.

Я предполагаю, что вы пытаетесь защитить паролем всю свою среду разработки? Я бы посоветовал вам использовать защиту .htaccess/.htpasswd или аналогичную для защиты сайта таким образом.

Если вы не можете или по какой-либо причине хотите сделать это в symfony, вы можете заставить symfony принимать конфигурацию таким образом, создав собственный sfSecurityConfigHandler.class.php

В обработчиках конфигурации есть метод getConfiguration, который отвечает за получение значений, установленных в различных файлах yml, и создание массива конечных значений после применения всех переопределений и т. д.

sfSecurityConfigHander.class.php имеет такую ​​конфигурацию getConfiguration:

static public function getConfiguration(array $configFiles)
{
  $config = self::flattenConfiguration(self::parseYamls($configFiles));

  // change all of the keys to lowercase
  $config = array_change_key_case($config);

  return $config;
}

в то время как конфигурация, зависящая от среды, например sfDatabaseConfigHandler.class.php, имеет такую ​​конфигурацию:

static public function getConfiguration(array $configFiles)
{
  $config = self::replaceConstants(self::flattenConfigurationWithEnvironment(self::parseYamls($configFiles)));

  foreach ($config as $name => $dbConfig)
  {
    if (isset($dbConfig['file']))
    {
      $config[$name]['file'] = self::replacePath($dbConfig['file']);
    }
  }

  return $config;
}

Ключевым отличием здесь является использование self::flattenConfigurationWithEnvironment вместо self::flattenConfiguration. Я думаю, если вы расширите sfSecurityConfigHandler с помощью:

class mySecurityConfigHandler extends sfSecurityConfigHandler {
    static public function getConfiguration(array $configFiles)
    {
      $config = self::flattenConfigurationWithEnvironment(self::parseYamls($configFiles));

      // change all of the keys to lowercase
      $config = array_change_key_case($config);

      return $config;
    }
}

а затем создайте файл config_handlers.yml в вашей конфигурации, сообщающий symfony использовать этот класс:

modules/*/config/security.yml:
  class:    sfSecurityConfigHandler
  file:     %sf_lib_dir%/path/to/mySecurityConfigHandler

Затем вы сможете использовать yml в соответствии с вопросом для настройки безопасности для каждой среды.

person benlumley    schedule 21.02.2010

Чего именно вы пытаетесь достичь? Я думаю, вы можете неправильно понять назначение свойства is_secure.

Обычно он используется для объявления того, какие модули/действия приложения должны требовать аутентификации (из подключаемого модуля, такого как sfGuard), а не для защиты всей среды.

person Steve    schedule 21.02.2010
comment
я хочу отключить безопасность для целей тестирования, не изменяя конфигурацию вручную, для меня это более удобно. И да, часть моего модуля защищена, я просто хочу протестировать его без защиты в среде разработки. - person belaz; 21.02.2010
comment
К сожалению, я думаю, что единственный способ сделать это — установить среду разработки на is_secure: false в каждом защищенном модуле. - person Steve; 21.02.2010
comment
то же самое, конкретная конфигурация среды не работает в модуле. - person belaz; 21.02.2010
comment
all: is_secure: true dev: is_secure: false Не работает? Прости; Я в тупике! - person Steve; 21.02.2010
comment
@belaz, обратите внимание, что каскад конфигурации всегда отменяется на более низком уровне, поэтому, если вы установите для безопасности внешнего интерфейса значение false, но у вас есть модули с собственным config/security/yml, где для безопасности установлено значение true, эти модули останутся безопасными. - person Tom; 21.02.2010