【问题标题】:Submitting a form logs the user out提交表单将用户注销
【发布时间】:2018-02-06 08:41:33
【问题描述】:

我目前在 Symfony 4 中遇到了一个非常令人困惑的问题(或者甚至没有,我不知道)。我已经手动设置了一个登录/注册系统,到目前为止它一直运行良好。我开发了一种表格,可以为他们的主要公司创建分支机构。我使用了 FormType 来实现这种精确的方式:

<?php

// src/Form/UserType.php
namespace App\Form;

use App\Entity\Filiale;
use App\Entity\Kammer;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

class FilialType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('apothekenname', TextType::class)
            ->add('email', EmailType::class)
            ->add('anrede', TextType::class)
            ->add('titel', TextType::class, array(
                'required' => false
            ))
            ->add('vorname', TextType::class)
            ->add('name', TextType::class)
            ->add('adresszusatz', TextType::class, array(
                'required' => false
            ))
            ->add('strasse', TextType::class)
            ->add('hausnummer', TextType::class)
            ->add('plz', NumberType::class)
            ->add('ort', TextType::class)
            //->add('kammer', TextType::class)
            ->add('kammer', EntityType::class, array(
                'class' => Kammer::class,
                'choice_label' => 'name',
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Filiale::class,
        ));
    }
}

?>

呈现 FormType 的 视图 如下所示,其中有一个单独的按钮触发 Bootstrap 模式对话框:

<div class="modal fade" id="modal-add-filiale" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLongTitle">Neue Filialapotheke anlegen</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        {{ form_start(form_add_filiale) }}
            <div class="form-group row">
                <label class="col-xl-3" for="filiale-apothekenname">Apothekenname</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.apothekenname) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-anrede">Anrede</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.anrede) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-titel">Titel</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.titel) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-vorname">Vorname</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.vorname) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-name">Name</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.name) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-strasse">Straße</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.strasse) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-hausnummer">Hausnummer</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.hausnummer) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-adresszusatz">Adresszusatz</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.adresszusatz) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-plz">PLZ</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.plz) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-stadt">Stadt</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.ort) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-email">Email</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.email) }}
                </div>
            </div>

            <div class="form-group row">
                <label class="col-xl-3" for="filiale-kammerbezirk">Kammerbezirk</label>
                <div class="col-xl-9">
                    {{ form_widget(form_add_filiale.kammer) }}
                </div>
            </div>

            <button type="submit">Hu</button>
        {{ form_end(form_add_filiale) }}
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Abbrechen</button>
        <button id="modal-add-filiale-save" type="submit" class="btn btn-primary">Speichern</button>
      </div>
    </div>
  </div>
</div>

处理表单、渲染和提交的控制器函数如下所示:

public function login(Request $request, AuthenticationUtils $authUtils, AuthorizationCheckerInterface $authChecker) {
        $isLoggedIn = ($authChecker->isGranted('ROLE_USER') || $authChecker->isGranted('ROLE_USER_MO'));

        if($isLoggedIn) {
            $filiale = new Filiale();
            $form = $this->createForm(FilialType::class, $filiale);

            $form->handleRequest($request);

            if($form->isSubmitted() && $form->isValid()) {
                $filiale->setUser($this->getUser());

                $em = $this->getDoctrine()->getManager();
                $em->persist($filiale);
                $em->flush();

                return $this->render('default/startpage_loggedin.html.twig', array(
                'breadcrumb' => 'BROTKRUMEN',
                'form_add_filiale' => $form->createView(),
                'toast_finished' => 1,
            ));
            }

            return $this->render('default/startpage_loggedin.html.twig', array(
                'breadcrumb' => 'BROTKRUMEN',
                'form_add_filiale' => $form->createView(),
            ));
        }
        else {
            // get the login error if there is one
            $error = $authUtils->getLastAuthenticationError();

            // last username entered by the user
            $lastUsername = $authUtils->getLastUsername();

            return $this->render('default/startpage_loggedout.html.twig', array(
                'last_username' => $lastUsername,
                'error'         => $error,
            ));
        }
    }

虽然代码排列不完美,而且我可能缺少一些最佳实践,但我仍然发现我面临的问题很奇怪。该表单只能在登录时访问 - 当我单击按钮打开模式,然后填写表单然后按提交按钮时,我会自动退出并显示错误消息“无效凭据”。

但是,当我将表单渲染和表单处理外包给一个新视图和一个新控制器函数时,代码完全按照它应该做的事情去做,而无需触及已登录的用户。

我的想法基本上已经用完了,如果你们能提供任何提示,我将不胜感激。提前谢谢!

编辑:Security.yml

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    encoders:
        App\Entity\User:
            algorithm: bcrypt
        legacy_encoder:
            algorithm: md5
            encode_as_base64: false
            iterations: 1

    providers:
        in_memory: { memory: ~ }
        db_provider:
            entity:
                class: App\Entity\User
                property: username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            #pattern: ^/
            #http_basic: ~

            anonymous: ~
            provider: db_provider

            user_checker: App\Security\UserChecker

            logout:
                path: /logout
                target: /

            form_login:
                login_path: home
                check_path: home

    access_control:
        - { path: ^/motivwelten, roles: ROLE_USER }
        - { path: ^/services/.*, roles: ROLE_USER }
        - { path: ^/shop, roles: ROLE_USER }
        - { path: ^/shop/.*, roles: ROLE_USER }

    erase_credentials: false

【问题讨论】:

  • 你能展示你的 security.yml 吗?
  • @MichałG 我已经在原始帖子中编辑了 Security.yml。问题可能是我基本上是在没有传递凭据的情况下提交到 login_path 路由,所以 symfony 尝试验证该“用户”并失败?
  • 您的操作名为login。它的路由是什么?
  • 主页:路径:/默认值:_controller: 'App\Controller\SecurityController::login'

标签: forms symfony form-submit symfony4


【解决方案1】:

虽然不是我最初提出的问题的直接解决方案,但我通过将除登录以外的所有逻辑从控制器中的登录方法移开来解决了这个问题。

无论如何,这应该是更好的做法。我相信向 /login 路由提交一个登录事件,并且由于没有凭据,服务无法验证用户并在显示“无效凭据”的同时终止会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2013-06-06
    • 2021-02-21
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多