Fork me on GitHub

Безопасность

Для обеспечения безопасности приложения в Silex используется провайдер SecurityServiceProvider, который обеспечивает проверку подлинности, авторизации и другие задачи безопасности. Этот провайдер устанавливает сервисы такие как security, security.token_storage, security.authentication_manager и другие, которые используются для обеспечения безопасности приложения.

Silex использует **Symfony2 Security ** компонент. Подробности можно посмотреть здесь.

Конфигурация

Конфигурация провайдера задается в app/Resources/Config/security.yml файле.

Пример приведен ниже:

service_providers:
    security:
        class: Providers\Security\MySecurityServiceProvider
        construct_parameters:
            security.role_hierarchy:
                ROLE_ADMIN: [ 'ROLE_USER', 'ROLE_ALLOWED_TO_SWITCH']
            # http://symfony.com/doc/2.3/cookbook/security/access_control.html
            security.access_rules:
                - [ '^/admin', 'ROLE_ADMIN' ]
                - [ '^/test', 'ROLE_ADMIN' ]
                - [ '^/tasks', 'ROLE_ADMIN' ]
                - [ '^/account$', 'ROLE_USER' ]
                - [ '^/blog/new$', 'ROLE_USER' ]
                - [ '^/todo$', 'ROLE_USER' ]
                - [ '^/login$', 'IS_AUTHENTICATED_ANONYMOUSLY' ]
            security.firewalls:
                default:
                    pattern:   ^/.*$
                    # When securing only some parts of your website, 
                    # the user information are not available in non-secured areas. 
                    # To make the user accessible in such areas, 
                    # enabled the anonymous authentication mechanism
                    anonymous: true
                    # http://example.com/somewhere?_switch_user=thomas
                    # http://example.com/somewhere?_switch_user=_exit
                    switch_user: true
                    form:
                        login_path: /login
                        check_path: /login_check
                        use_referer: true
                    logout:
                        logout_path: /logout
                    users: ~

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

Если количество пользователей в приложении ограничено (например это ваш собственный сайт), то описание идентификационных данных пользователей (логин, пароль) могут быть заданы в файле конфигурации app/Resources/Config/security.yml.

Пример приведен ниже:

...
users:
    admin:
        - ROLE_ADMIN
        # raw password is foo
        - 5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg==
    user:
        - ROLE_USER
        # raw password is foo
        - 5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg==   
...

Если же количество пользователей может быть большим, как в нашем случае, то необходимо в приложении определить пользовательский User Provider для базы данных, которую вы используете. Этот провайдер будет сохранять данные новых пользователей в базе данных.

В нашем случае определены три User Providers:

  1. DbalUserProvider app/Providers/Security/DbalUserProvider.php для Doctrine(DBAL)
  2. OrmUserProvider app/Providers/Security/OrmUserProvider.php для Doctrine(ORM)
  3. ArUserProvider app/Providers/Security/ArUserProvider.php для PHP ActiveRecord

Какой из них выбрать задается в классе MySecurityServiceProvider app/Providers/Security/MySecurityServiceProvider.php, который определяет класс Security в файле конфигурации app/Resources/Config/security.yml.

service_providers:
    security:
        class: Providers\Security\MySecurityServiceProvider
...

Использование

Дополнительные функции для обеспечения безопасности приложения заданы в примеси app/Controllers/Helper/SecurityTrait.

В нашем приложении проверка подлинности пользователя определяется с помощью действия loginAction класса контроллера SecurityController app/Controllers/SecurityController.php с помощью вызова формы app/Views/Controller/security/login.html.twig.

В форме проходят два уровня валидации: на клиентском уровне и серверном уровне.

На клиентском уровне валидация проходит с помощью добавления сервиса FormValidation.

Пример добавления сервиса с параметрами валидации можно посмотреть ниже:

...
<script type="text/javascript">
    BSA.ScriptResources.push('FormValidation');
    addScriptParams('FormValidation',
            {
                form: 'form[name="login"]',
                rules: {
                    _username: {
                        required: true,
                        minlength: 3
                    },
                    _password: {
                        required: true,
                        minlength: 3
                    }
                },
                ...
            });
</script>
...