2015-07-31 8 views
2

вот моя проблема: у меня есть две категории пользователей в моем приложении (локаторы и propriétaires), и мне нужна одна (или две) форма входа. Я использую PUGXMultiUserBundle для управления всеми моими пользователями.Symfony 2 с 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 %} 

Мой файл приложение/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 

И мой файл приложения/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» и еще один для нас ers "locataires". А как настроить различные межсетевые экраны в файле security.yml?

Другой вопрос: на ваш взгляд, мне нужно создать разные «роли» в файле security.yml?

Большое спасибо.

ответ

2

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 } 

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