вот моя проблема: у меня есть две категории пользователей в моем приложении (локаторы и propriétaires), и мне нужна одна (или две) форма входа. Я использую PUGXMultiUserBundle для управления всеми моими пользователями.
вот вид для логгиновых «владельцев»:
{% 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?
Огромное спасибо.
PUGXMultiUserBundle построен поверх FOSUserBundle, он помогает управлять разными типами пользователей, используя наследование таблицы doctrine, глядя на вашу базу данных, вы можете увидеть, как есть родительская таблица «Пользователь» и две дочерние таблицы «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 }
Надеюсь, это поможет вам, я знаю, как это выглядит новичком, потому что я был там. Не торопитесь, и я здесь, если вам нужна помощь.