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 }

DefaultController.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">

这导致请求为空:对不起,一旦我将其设置为

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

它工作得很好,现在我必须用 Doctrine Entity Provider 检查它,看看它是如何进行的:D

4

3 回答 3

3

我相信你需要:

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

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

“错误凭据”错误,即使输入正确的信息,也只是指出某处发生了一些错误。如果仍然无法与我上面提到的内容一起使用,请检查错误日志并告诉我们。

于 2012-04-14T08:54:41.817 回答
0

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

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

山姆

于 2012-04-13T03:16:13.230 回答
0

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

于 2012-04-13T03:31:56.193 回答