здесь моя проблема: у меня есть две категории пользователей в моем приложении (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?
Спасибо большое.
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 }
Я надеюсь, что это поможет вам, я знаю, как это выглядит для новичка, потому что я был там. Не торопитесь, и я здесь, если вам нужна помощь.
Других решений пока нет …