无法让登录路由在 Symfony 2 中工作


Can't get the login routes to work in Symfony 2

我已经尝试了每个手册上的所有配置,但仍然无法让它工作!有人可以帮我找到错误吗?这是我的代码:

安全.yml

security:
    encoders:
        Symfony'Component'Security'Core'User'User: plaintext
role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
    in_memory:
        users:
            user:  { password: userpass, roles: [ 'ROLE_USER' ] }
            admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
firewalls:
    main:
        pattern: ^/
        provider: in_memory
        anonymous: true
        security: true
        form_login:
            login_path: default_login
            check_path: default_check
        logout:
            path: default_logout
            target: default_index
        remember_me:
            key: %secret%
            lifetime: 3600
            domain: ~
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    #- { path: ^/afiliados, roles: ROLE_SUPER_ADMIN}
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }

默认控制器.php

namespace Epika'ClubBundle'Controller;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Route;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Template;
use Symfony'Component'Security'Core'SecurityContext;
/**
 * Default controller.
 *
 */
class DefaultController extends Controller
{

    /**
     * @Route("/login", name="default_login")
     * @Template()
     */
    public function loginAction()
    {
        $request = $this->getRequest();
        $session = $request->getSession();
        // get the login error if there is one
        if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
                $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
        } else {
            $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
        }
        return array(
                // last username entered by the user
                'last_username' => $session->get(SecurityContext::LAST_USERNAME),
                'error'         => $error
        );
    }
    /**
     * @Route("/login_check", name="default_check")
     * 
     */
    public function loginCheckAction()
    {
        //Security Layer
    }
    /**
     * @Route("/logout", name="default_logout")
     */
    public function logoutAction()
    {
        //Security Layer
    }
}

在我的表格中,我有

<form name="loginForm" action="{{ path('default_check') }}" method="POST" enctype="text/plain">
<input type="text" name="_username" placeholder="Nombre de Usuario" />
<input type="password" name="_password" placeholder="Tú Contraseña" />
<input type="checkbox" name="_remember_me" />
<input type="hidden" name="_target_path" value="/index" />
<a href="javascript:submit()"><img src="{{ asset('bundles/epikaclub/images/entrar.png') }}" /></a>
<script type="text/javascript">
function submit()
{
    document.loginForm.submit();
}
</script>

好的伙计们非常感谢您的所有帮助,问题是登录表单 enctype 设置为

<form name="loginForm" action="{{ path('login_check') }}" method="post" enctype="text/plain">

这导致请求为空:S 抱歉,一旦我将其设置为

<form name="loginForm" action="{{ path('login_check') }}" method="post" enctype="application/x-www-form-urlencoded">

工作正常,现在我必须与教义实体提供者检查它,看看它是如何:D

我相信

你需要:

  • 使用实际的URL(就像其他人在这里所说的那样,即"/login_check")
  • 不要为login_check路由创建控制器。我认为路线本身甚至没有必要。Symfony2将看到对"/login_check"的请求并自动拦截它。

在其中一个旁注中对此进行了解释:http://symfony.com/doc/current/book/security.html#using-a-traditional-login-form

"错误凭据"错误,即使输入了正确的信息,也只是指出某处发生了一些错误。检查错误日志,如果它仍然不适用于我上面提到的内容,请告诉我们。

您可能需要调整login_path值,并将check_path值调整为实际的URL路径,如下所示:

firewalls:
    [...]
    main:
        [...]
        form_login:
            login_path: /login
            check_path: /login_check

山 姆

与其他选项不同,check_path不支持路由名称。将其设置为类似 /login_check 的路径。