Symfony 2 с PUGXMultiUserBundle и формой множественного входа
Вот моя проблема: у меня есть две категории пользователей в моем приложении (locataires и propriétaires), и мне нужна одна (или две) форма входа в систему. Я использую PUGXMultiUserBundle для управления всеми моими пользователями.
вот мнение для входа "proprietaires":
{% extends "::layout.html.twig" %}
{% block title %}
Nous contacter - {{ parent() }}
{% endblock %}
{# Contents #}
{% block body %}
<div class="row">
<div class="col-md-12">
<div class="well">
<form action="{{ path('proprietaire_login_check') }}" method="post">
<fieldset>
<legend><i class="fa fa-lock"></i> Secure Sign in</legend>
<div class="form-group">
<label for="username">Username</label>
<input type="text" id="username" name="_username" value="" class="form-control"/>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="password" name="_password" class="form-control" />
</div>
<button type="submit" class="btn btn-primary">
<i class="fa fa-sign-in"></i> Sign in
</button>
</fieldset>
</form>
</div>
</div>
</div>
{% endblock %}
Мой файл app/config/config.yml:
fos_user:
db_driver: orm
firewall_name: main
user_class: AppBundle\Entity\User
service:
user_manager: pugx_user_manager
pugx_multi_user:
users:
proprietaire:
entity:
class: AppBundle\Entity\Proprietaire
# factory:
registration:
form:
type: AppBundle\Form\Type\RegistrationProprietaireFormType
name: fos_user_registration_form
validation_groups: [Registration, Default]
template: proprietaire.form.html.twig
profile:
form:
type: AppBundle\Form\Type\ProfileProprietaireFormType
name: fos_user_profile_form
validation_groups: [Profile, Default]
locataire:
entity:
class: AppBundle\Entity\Locataire
registration:
form:
type: AppBundle\Form\Type\RegistrationLocataireFormType
template: locataire.form.html.twig
profile:
form:
type: AppBundle\Form\Type\ProfileLocataireFormType
И мой файл app/config/security.yml:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
FOS\UserBundle\Model\UserInterface: sha512
# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
in_memory:
memory: ~
fos_userbundle:
id: fos_user.user_manager
proprietaire:
entity:
class: AppBundle:Proprietaire
property: username
locataire:
entity:
class: AppBundle:Locataire
property: username
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
# form_login:
# provider: fos_userbundle
# csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
# logout:
# path: /logout
# target: /
anonymous: true
proprietaire_firewall:
pattern: .*
form_login:
# Soumet le formulaire de connection ici
provider: fos_userbundle
check_path: /proprietaire_login_check
logout:
path: /proprietaire_logout
target: /
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/profile, role: ROLE_USER }
Я начинаю с Symfony 2, и я не понимаю, как создать форму входа для пользователей "proprietaires" и еще одну для пользователей "locataires". А как настроить разные брандмауэры в файле security.yml?
Другой вопрос: по вашему мнению, мне нужно создавать разные "роли" в моем файле security.yml?
Спасибо большое.
1 ответ
PUGXMultiUserBundle построен поверх FOSUserBundle, он помогает управлять различными типами пользователей, используя наследование таблиц доктрины, просматривая вашу базу данных, вы можете увидеть, как существует родительская таблица "Пользователь" и две дочерние таблицы "locataire" и "proprietaire"., Под разными типами пользователей подразумевается точка, где есть разница; например: регистрация пользователя: есть разница в полях формы и форма редактирования профиля также отличается. Все остальное, где нет никакой разницы между пользователями, входом в систему на веб-сайте, страницей профиля, действием выхода из системы... обрабатываются, как обычно, непосредственно FOSUserBundle.
ТАК конкретно, да, вы можете использовать одну форму входа для двух пользователей (на самом деле я использую форму входа для трех разных пользователей). Вам не нужен брандмауэр на пользователя, достаточно одного брандмауэра. И да, вероятно, вам нужно определить роли в разделе контроля доступа, потому что вам нужно будет защитить URL, относящийся только к locataire, например: /locataire/pays/rent/1 (лучший способ дать пользователю роль - это в конструкторе класса вот так:
public function __construct() {
parent::__construct();
$this->roles = array('ROLE_LOCATAIRE');
};
)
Итак, в вашем файле security.yml:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
OC\UserBundle\Entity\User: sha512
providers:
main:
id: fos_user.user_provider.username_email
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
main:
pattern: ^/
anonymous: true
provider: main
form_login:
login_path: /login
check_path: fos_user_security_check
always_use_default_target_path: true
default_target_path: /profile
logout:
path: fos_user_security_logout
target: /index
role_hierarchy:
ROLE_LOCATAIRE: ROLE_USER
ROLE_PROPRIETAIRE: ROLE_USER
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/locataire, roles: ROLE_LOCATAIRE }
- { path: ^/proprietaire, roles: ROLE_PROPRIETAIRE }
Я надеюсь, что это поможет вам, я знаю, как это выглядит для новичка, потому что я был там. Не торопитесь, и я здесь, если вам нужна помощь.