簡體   English   中英

Symfony 2.3登錄表單未通過身份驗證

[英]Symfony 2.3 login form isn't authenticating

我正在嘗試用Symfony2.3實現一個相當基本的登錄表單,但是遇到一個錯誤, 有時在提供正確的憑據后重定向到預期的頁面,但有時卻沒有(相反,我只是被重定向回了到登錄頁面)。 這是我的security.yml文件:

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
        Acme\MyBundle\Entity\User: sha512
    providers:
        main:
            id: acme.user.provider
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        login_firewall:
            pattern: ^/login$
            security: false
        secured_area:
            pattern: ^/
            form_login: ~
            logout:
                path:   /logout
                target: /
    access_control:
        - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
        - { path: ^/, roles: ROLE_USER, requires_channel: https }

這是我的SecurityController

<?php

namespace Acme\MyBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContextInterface;

/**
 * Class SecurityController
 * @package Acme\MyBundle\Controller
 *
 * @Route("/")
 */
class SecurityController extends Controller
{
    /**
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @Route("/login", requirements={"_scheme" = "https"}, path="login")
     */
    public function LoginAction(Request $request)
    {
        $session = $request->getSession();

        // get the login error if there is one
        if ($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)) {
            $error = $request->attributes->get(
                SecurityContextInterface::AUTHENTICATION_ERROR
            );
        } elseif (null !== $session && $session->has(SecurityContextInterface::AUTHENTICATION_ERROR)) {
            $error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR);
            $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR);
        } else {
            $error = '';
        }

        // last username entered by the user
        $lastUsername = (null === $session) ? '' : $session->get(SecurityContextInterface::LAST_USERNAME);

        return $this->render(
            'AcmeMyBundle:Security:login.html.twig',
            array(
                // last username entered by the user
                'last_username' => $lastUsername,
                'error'         => $error,
            )
        );
    }

    /**
     * @Route("/login_check", requirements={"_scheme" = "https"}, path="login_check")
     */
    public function LoginCheckAction()
    {

    }

    /**
     * @Route("/logout", requirements={"_scheme" = "https"}, path="logout")
     */
    public function LogoutAction()
    {

    }
}

這是我的包的routing.yml文件:

_security:
    resource: "@AcmeMyBundle/Controller/SecurityController.php"
    type: annotation

當我提供適當的憑據時,大約20%的時間我已正確登錄/重定向到給定的URL。 其他80%的時間我都直接重定向回了表單登錄頁面,沒有錯誤消息。 嘗試使用不正確的憑據登錄時,我也看不到任何錯誤消息。

更新:看起來問題在於Symfony針對每個請求在我的數據庫中創建了多個會話。 我正在使用pdo處理程序。

擺脫您的login_firewall ,這是不需要的,因為您具有允許匿名訪問登錄頁面的login_firewall規則。 防火牆越少越好。

我懷疑您無法登錄的時間是,您直接訪問登錄頁面(/ login),因此嘗試在“ login_firewall”下登錄,這是無用的,因為它僅對/ login頁面有用。 在您的login_firewall下登錄后,您將重定向到/ ,但未在“ secured_area”防火牆(正在保護/ )下進行身份驗證,因此它要求您再次登錄,但這一次是在正確的防火牆下進行。 我認為這次您可以登錄。

這可能是問題所在,但無論如何,擺脫您的login_firewall

原來問題出在我存儲會話的Session實體/表中。 我正在使用PDOSessionHandler在數據庫中存儲會話,並且在我的ORM Session實體中具有以下$id

<?php

namespace Acme\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Session
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Session
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

$id不應為整數類型,而應(顯然為(-_-)為字符串類型。將屬性更改為:

/**
 * @var integer
 *
 * @ORM\Column(type="string", length=255)
 * @ORM\Id
 */
private $id;

並運行php app/console doctrine:schema:update --force ,似乎一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM