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 }

Я надеюсь, что это поможет вам, я знаю, как это выглядит для новичка, потому что я был там. Не торопитесь, и я здесь, если вам нужна помощь.

Другие вопросы по тегам