Symfony2,使用数据库登录,凭据错误,未执行任何数据库查询


Symfony2, login using database, bad credentials error, No database queries were performed

Symfony 2.7

我正在关注并修改示例项目:http://sourceforge.net/p/p5chi-xshare/wiki/Home/

我收到错误的凭据。我不明白错误在哪里。我已经坐在这上面第二天了。我浏览了十几个论坛,更正了表单字段,security.yml。但错误仍然存在。

http://127.0.0.1:8000/acme/demo/secured/login用户名:xshare,密码:xshare。

我相信错误可能在编码器中如果我使用:

encoders:
    Symfony'Component'Security'Core'User'User: plaintext
    Xshare'UserBundle'Entity'User: sha512

我收到错误:凭据不正确。Symfony探查器显示"未执行任何数据库查询。"

如果我尝试:

encoders:
    Xshare'UserBundle'Entity'User: sha512

我收到错误:凭据不正确。Symfony探查器显示"未执行任何数据库查询。"

如果我尝试:

   encoders:
        Symfony'Component'Security'Core'User'User: plaintext
        Xshare'UserBundle'Entity'User: 
            algorithm: sha512
            encode_as_base64: false
            iterations: 10

我得到错误:控制器必须返回一个响应(给定为null)。您是否忘记在控制器中的某个位置添加返回语句?Symfony探查器显示"未执行任何数据库查询。"或者我得到了错误:找不到"GET/"的路由(来自http://127.0.0.1:8000/acme/demo/secured/login)。Symfony探查器显示"未执行任何数据库查询。"

C: ''Bitnami''wampstack-5.530-0''sym_prog''xshare''app''config''security.yml

# To get started with security, check out the documentation:
# http://symfony.com/doc/current/book/security.html
security:
    # http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
    providers:
        xshare_db: 
            entity: { class: XshareUserBundle:User, property: username }         
    encoders:
        Symfony'Component'Security'Core'User'User: plaintext
        Xshare'UserBundle'Entity'User: sha512
    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        login:
            pattern:   ^/acme/demo/secured/login$
            security: false
            provider: xshare_db
            #anonymous: ~    
            # http://symfony.com/doc/current/cookbook/security/form_login_setup.html#avoid-common-pitfalls            
        default:
            pattern: ^/acme/demo/secured
            provider: xshare_db
            form_login:
                check_path: /acme/demo/secured/loginCheck
                login_path: /acme/demo/secured/login
            logout:  
                path: /acme/demo/secured/logout
                target: /acme/demo/secured/login

    access_control:
        - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: [ROLE_USER, ROLE_ADMIN] }        
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN  

C: ''Bitnami''wampstack-5.530-0''sym_prog''xshare''app''config''routing.yml

logout:
    path: /acme/demo/secured/logout
    defaults: { _controller: Acme:DemoBundle:Secured:logout}
login:
    path: /acme/demo/secured/login
    defaults: { _controller: Acme:DemoBundle:Secured:login}    
login_check:
    path: /acme/demo/secured/loginCheck
    #route-path, acme_demo_secured_logincheck   ANY ANY ANY  /acme/demo/secured/loginCheck  
    defaults: { _controller: Acme:DemoBundle:Secured:loginCheck}

''sym_prog''xshare''src''xshare''UserBundle''Entity''User.php

   <?php
    namespace Xshare'UserBundle'Entity;
    use Symfony'Component'Security'Core'User'UserInterface;
    use …
    /**
     * Xshare'UserBundle'Entity'User
     *
     * @ORM'Table(name="user", indexes = {@ORM'Index(name="search_idx", columns={"firstname", "lastname", "created_at"})})
     * @ORM'Entity(repositoryClass="Xshare'UserBundle'Repository'UserRepository")
     * @ORM'HasLifecycleCallbacks()
     * @UniqueEntity(fields="email", message="user.email.not_unique")
     * @UniqueEntity(fields="username", message="user.login.not_unique")
     */
    class User implements UserInterface, 'Serializable
    {
        /**
         * @ORM'Column(type="integer")
         * @ORM'Id
         * @ORM'GeneratedValue(strategy="AUTO")
         */
        private $user_id;
        /**
         * @var string $username
         * @ORM'Column(type="string", length=25, unique=true)
         * @Assert'NotBlank(
         *      message="user.not_blank"
         * )
         */
        private $username;
….

C: ''Bitnami''wampstack-5.530-0''sym_prog''xshare''src''xshare''UserBundle''DataFixtures''ORM''UserFixtures01.php

<?php
namespace Xshare'UserBundle'DataFixtures'ORM;
use Doctrine'Common'DataFixtures'AbstractFixture;
use ...
/**
 * Description of UserFixtures
 */
class UserFixtures01 extends AbstractFixture implements OrderedFixtureInterface {
    public function load(ObjectManager $manager)
    {
        //simple user
        $user1 = new User();
        $user1->setActive(1);
        $user1->setBirthDate('11/07/1989');
        $user1->setEmail('xshare@xshare.com');
        $user1->setFirstname('xshare');
        $user1->setLastname('xshare');
        $user1->setPassword('xshare');
        $encoder = new MessageDigestPasswordEncoder('sha512', false, 10);
        $password = $encoder->encodePassword($user1->getPassword(), $user1->getSalt());
        $user1->setPassword($password);        
        $user1->setPhone('079256354');
        $user1->setSex('m');
        $user1->setTypeAccess('user');
        $user1->setUsername('xshare');
        $manager->persist($user1);        
       ….
        $manager->flush();
    }
}
?>

C: ''Bitnami''wampstack-5.530-0''sym_prog''xshare''src''Acme''DemoBundle''Controller''SecuredController.php

<?php
namespace Acme'DemoBundle'Controller;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use ...
/**
 * @Route("/demo/secured")
 */
class SecuredController extends Controller
{
    /**
     * @Route("/login", name="_demo_login")
     */
    public function loginAction()
    {
        if ($this->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
            $error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
        } else {
            $error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
        }
     return $this->render( 'AcmeDemoBundle:Secured:login.html.twig',
        array('error'         => $error,
         ) );

    }
    /**  
     * @Route("/loginCheck")
     */
    public function loginCheckAction()
    //public function securityCheckAction()
    {
        // The security layer will intercept this request
    }
    /**
     * @Route("/logout", name="_demo_logout")
     */
    public function logoutAction()
    {
        // The security layer will intercept this request
    }
    /**
     * @Route("/logoutCheck")
     */
    public function logoutCheckAction()
    //public function logoutAction()
    {
        // The security layer will intercept this request
    }

C: ''Bitnami''wampstack-5.530-0''sym_prog''xshare''src''Acme''DemoBundle''Resources''views''Secured''login.html.twig

{% extends 'AcmeDemoBundle::layout.html.twig' %}
{% block content %}
    <h1>Login</h1>
    <p>
        Choose between two default users: <em>user/userpass</em> <small>(ROLE_USER)</small> or <em>admin/adminpass</em> <small>(ROLE_ADMIN)</small>
    </p>
    <p> There exists: user: xshare, password: xshare </p>
    {% if error %}
        <div class="error">{{ error.message }}</div>
    {% endif %}
    <form action="{{ path("acme_demo_secured_logincheck") }}" method="post" id="login">
        <div>
            <label for="username">Username</label>
            <input type="text" id="username" name="_username" value="" />
        </div>
        <div>
            <label for="password">Password</label>
            <input type="password" id="password" name="_password" />
        </div>
        <input type="submit" class="symfony-button-grey" value="LOGIN" />
    </form>
    {% endblock %}
    {% set code = code(_self) %}

答案很复杂。

1) 对于错误:未找到"GET/"的路由,请参阅解决方案:未找到";获取/";登录时的Symfony我没有为/定义路由。当你试图用错误的凭据登录时,我会被重定向到登录(有一个路由)。但是,如果我成功了,你会被重定向到/。我必须修改C:''Bitnami''wampstack-5.530-0''sym_prog''xshare''app''config''routing.yml例如,删除/general并改用/
XshareGeneralBundle:资源:"@XshareGeneralBundle/Controller/"类型:注释前缀:/

2) 对于错误的登录凭据,我使用了share/SecurityBundle,而不是Acme/Demobundle,并根据vikbert示例修改了SecurityControler loginAction:https://github.com/vikbert/starwarsevents未工作的代码被注释掉。

C: ''Bitnami''wampstack-5.530-0''sym_prog''xshare''src''xshare''SecurityBundle''Controller''SecurityController.php

<?php
namespace Xshare'SecurityBundle'Controller;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'Security'Core'SecurityContext;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Route;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Template;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Method;
use Doctrine'Common'Collections'ArrayCollection;
/**
 * @Route("/private")
 */
class SecurityController extends Controller {
  /**
   * checks the result of login attempt
   * @Route("/login", name="_login")
   * @Method({"GET","POST"})
   * @Template()
   */
  public function loginAction() {
    $authenticationUtils = $this->get('security.authentication_utils');
        // get the login error if there is one
    $error = $authenticationUtils->getLastAuthenticationError();
        // last username entered by the user
    $lastUsername = $authenticationUtils->getLastUsername();
    return array(
            // last username entered by the user
            'last_username' => $lastUsername,
            'error'         => $error,
        ); 
    /*
    if ($this->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
      $error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
    } else {
      $error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
    }
    return array(
      'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
      'error' => $error,
      'referer' => $this->getRequest()->getRequestUri(),  
    ); */
  }
  /**
   * @Route("/login_check", name="_security_check")
   */
  public function securityCheckAction() {
    // The security layer will intercept this request
  }
  /**
   * @Route("/logout", name="_logout")
   */
  public function logoutAction() {
    // The security layer will intercept this request
  }