Безопасность
Для обеспечения безопасности приложения в 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:
- DbalUserProvider
app/Providers/Security/DbalUserProvider.php
для Doctrine(DBAL) - OrmUserProvider
app/Providers/Security/OrmUserProvider.php
для Doctrine(ORM) - 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>
...