Я построил систему входа в систему в Symfony. На каждой странице, которая защищена , мне нужно проверять, соответствует ли имя пользователя паролю. Я написал функцию: isValidAuth() в myUser.class.php . Тем не менее, мне нужно написать эти строки в действиях для каждой страницы:

if(!isValidAuth())
{
    $this->forward('home', 'logout');
}

Что довольно неудобно, когда у вас есть несколько защищенных страниц и модулей. Есть ли способ запустить эти строки как функцию, если страница is_secured? Как при доступе к executeIndex() при загрузке страницы?

0
Daniel 28 Авг 2011 в 00:32

2 ответа

Лучший ответ

Лучшее место для этого - цепочка фильтров, я бы даже предложил расширить sfBasicSecurityFilter. Чтобы включить расширенный класс, отредактируйте apps / myapp / config / filters.yml

rendering: ~
security:
  class: myExtendedSecurityFilter

# Generally, you will want to insert your own filters here

cache:     ~
execution: ~

Вместо расширения sfBasicSecurityFilter вы также можете создать новый класс, расширяющий sfFilter. Подробнее о фильтрах читайте здесь:

http://www.symfony-project.org/gentle-introduction/1_4/en/06-Inside-the-Controller-Layer#chapter_06_filters

0
Gerry 28 Авг 2011 в 09:23

В Symfony есть встроенная функция, которая справляется с этим. Руководство предназначено для версии 1.2, но оно также должно работать и для версии 1.4: http://www.symfony-project.org/book/1_2/06-Inside-the-Controller-Layer.

Поскольку значения конфигурации в 1.4 изменились на true / false вместо on / off, вам придется изменить их: http://www.symfony-project.org/reference/1_4/en/08-Security

Приложения / интерфейс / модули / mymodule / config / security.yml

all:
  is_secure:   true       # for all actions of a module

foo:
  is_secure:   false       # action foo is public 

В apps / frontend / config / settings.yml вам нужно будет указать модуль и действие, которое выполняет вход в систему и т. д.

all:
  .actions:
    login_module:  default
    login_action:  login

    secure_module: default
    secure_action: secure

И последнее, но не менее важное: вам нужно установить флаг аутентификации для вашего пользователя (обычно после входа в систему;)):

$this->getUser()->setAuthenticated(true);

Кстати. возможно, вам следует установить плагин sfdoctrineguardplugin, который обеспечивает обработку пользователей, вход в систему и т. д. из коробки;)

1
Flask 28 Авг 2011 в 08:50