[英]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.