0

我安装了 FOSUserBundle,但我的设计要求登录表单出现在主页中,而不是单独的登录页面,而是包含在由我的 HomeBundle:Default:index 控制的主页中。

因此,如果您访问需要登录的页面,您将被重定向到我的主页,我的登录表单所在的位置。

为了做到这一点:我改变了vendor > friendsofsymfony > user-bundle > FOS > Resources > routing > security.xml

<route id="fos_user_security_login" pattern="/login">
    <default key="_controller">FOSUserBundle:Security:login</default>
</route>

指向显示我的主页的控制器。这有效(它显示了我的登录页面)但是问题来了,当我尝试登录时它永远不会让我登录,而是显示相同的页面。输入的名称是正确的,也是“动作”,与默认登录表单的值相同。

如果我默认使用登录页面,它会让我登录,所以数据库没问题。我试图打印登录过程可能会导致打印 $error 找出此代码的错误:

$request = $this->container->get('request'); /* @var $request \Symfony\Component\HttpFoundation\Request / $session = $request->getSession(); / @var $session \Symfony\Component\HttpFoundation\Session */

    // get the error if any (works with forward and redirect -- see below)
    if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
        $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
    } elseif (null !== $session && $session->has(SecurityContext::AUTHENTICATION_ERROR)) {
        $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
        $session->remove(SecurityContext::AUTHENTICATION_ERROR);
    } else {
        $error = '';
    }

    if ($error) {
        // TODO: this is a potential security risk (see http://trac.symfony-project.org/ticket/9523)
        $error = $error->getMessage();
    }
    // last username entered by the user
    $lastUsername = (null === $session) ? '' : $session->get(SecurityContext::LAST_USERNAME);

    $csrfToken = $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate');

但似乎没有错误。

4

3 回答 3

3

重写文件夹 Resources/views/Security/ 中的文件 login.html.twig

基本代码是:

{% extends "FOSUserBundle::layout.html.twig" %}

{% block fos_user_content %}
{% if error %}
    <div>{{ error|trans({}, 'FOSUserBundle') }}</div>
{% endif %}

<form action="{{ path("fos_user_security_check") }}" method="post">
    <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />

    <label for="username">{{ 'security.login.username'|trans({}, 'FOSUserBundle') }}</label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" required="required" />

    <label for="password">{{ 'security.login.password'|trans({}, 'FOSUserBundle') }}</label>
    <input type="password" id="password" name="_password" required="required" />

    <input type="checkbox" id="remember_me" name="_remember_me" value="on" />
    <label for="remember_me">{{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }}</label>

    <input type="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans({}, 'FOSUserBundle') }}" />
</form>
{% endblock fos_user_content %}
于 2013-04-03T15:40:31.037 回答
1

也不要忘记覆盖 getParent 方法。正如文档所说。

<?php

namespace Acme\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeUserBundle extends Bundle
{
    public function getParent()
   {
    return 'FOSUserBundle';
   }
}

?>
于 2013-07-13T21:31:59.957 回答
0

您可以按照此处的说明覆盖模板login.html.twig

我已经做到了。

于 2012-10-05T03:17:30.117 回答