2012-08-04 116 views
0

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

所以,如果你访问一个页面,需要登录,你会被重定向到我的主页,我的登录表单是。

为了做到这一点:我改变了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> 

指向显示我的主页控制器。 这个工程(它显示我的登录页面),但这里出现了问题,当我尝试登录时,它从未登录过我,而是显示相同的页面。输入的名称是正确的,也是“动作”,与默认登录表单的值相同。

如果我在默认情况下使用登录页面,它会将我登录,所以db无问题。 我试图打印错误日志中的过程可能特罗打印该计算出这个代码$错误:

$请求= $这个 - >容器 - >获取(“请求”);请求/ $ session = $ request-> getSession(); / @var $会话\的Symfony \分量\ HttpFoundation \会议*/

// 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'); 

但似乎没有错误。

回答

0

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

我已经完成了。

+0

的链接[2.x版](https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_templates.rst) 和[symfony的文档内](HTTPS ://symfony.com/doc/master/bundles/FOSUserBundle/overriding_templates.html) – 2018-01-07 12:57:39

2

重写文件夹资源/视图/安全/

基本代码里面的文件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 %} 
1

另外别忘了重写的getParent方法。正如文件所述。

<?php 

namespace Acme\UserBundle; 

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

?> 
相关问题