簡體   English   中英

Symfony2 認證問題

[英]Symfony2 authentification issue

試圖在 Symfony2 中實現基於角色的用戶訪問,但不知何故 Symfony2 沒有從數據庫中獲取用戶。 我得到的只是 Bad Credentials 錯誤。 當我嘗試以內存用戶身份登錄時 - 它工作正常。 我錯過了什么嗎?

我的安全.yml

security:
encoders:
    Symfony\Component\Security\Core\User\User:
        algorithm: sha512
        encode-as-base64: true
        iterations: 3

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' ] }
    main:
        entity: { class: Web20CMSBundle:User, property: username }              

firewalls:    
    secured_area:        
        pattern: /admin.*|/login_check
        anonymous: ~
        form_login:
            check_path: /login_check
            login_path: /login
        logout: { path: /admin/logout, target: / }
        security: true
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
access_control:        
    - { path: /admin/.*, role: ROLE_ADMIN }
    - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /login.*, role: IS_AUTHENTICATED_ANONYMOUSLY }

我的路由.yml

_security_login:
    pattern:  /login
    defaults: { _controller: Web20CMSBundle:Security:login }

_security_check:
    pattern:  /login_check

_security_logout:
    pattern:  /admin/logout

index:
    pattern: /
    defaults: { _controller: JutaShopBundle:Default:index }

我的角色實體

<?php
namespace Web20\CMSBundle\Entity;

use Symfony\Component\Security\Core\Role\RoleInterface;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="role")
 */
class Role implements RoleInterface
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="name", type="string", length="255")
     */
    protected $name;

    /**
     * @ORM\Column(name="createdAt", type="datetime", name="created_at")
     */
    protected $createdAt;

    /**
     * @return integer The id.
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string The name.
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param string $value The name.
     */
    public function setName($value)
    {
        $this->name = $value;
    }

    /**
     * @return DateTime A DateTime object.
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Constructs a new instance of Role.
     */
    public function __construct()
    {
        $this->createdAt = new \DateTime();
    }

    /**
     * Implementation of getRole for the RoleInterface.
     * 
     * @return string The role.
     */
    public function getRole()
    {
        return $this->getName();
    }
}

我的安全控制器

<?php

namespace Web20\CMSBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\SecurityContext;
use Web20\CMSBundle\Entity\Category;

class SecurityController extends Controller
{
    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);
        }

        //$em = $this->getDoctrine()->getEntityManager();
        //$salt = $em->getRepository('Web20\CMSBundle\Entity\User')->findOneById(1);
        //print_r($salt->getSalt());

        return $this->render('Web20CMSBundle:Default:login.html.twig', array(
            'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
            'error' => $error
        ));
    }

}

我的用戶實體

<?php
namespace Web20\CMSBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;

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

    /**     
     * @ORM\Column(name="username", type="string", length="255", unique=true)
     */ 
    private $username;

    /**
     * @ORM\Column(name="password", type="string", length="255")
     */
    private $password;

    /**
     * @ORM\Column(name="salt", type="string", length="255")
     */
    private $salt;

    /**  
     * @ORM\ManyToMany(targetEntity="Role")
     * @ORM\JoinTable(name="user_role",
     *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")}, 
     *     inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
     * )
     * @var ArrayCollection $role
     * !IMPORTANTE!: onDelete="cascade" is necessary
     */
    private $userRoles;

    /**
    * @ORM\Column(name="firstName", type="string")
    */
    private $firstName;

    /**
    * @ORM\Column(name="lastName", type="string")
    */
    private $lastName;

    /**
    * @ORM\Column(name="email", type="string")
    */
    private $email; 

    /**
     * @return string The username.
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * @param string $value The username.
     */
    public function setUsername($value)
    {
        $this->username = $value;
    }

    /**
     * @param string $value The first name.
     */
    public function setFirstName($value)
    {
        $this->firstName = $value;
    }

    /**
     * @param string $value The last name.
     */
    public function setLastName($value)
    {
        $this->lastName = $value;
    }   

    /**
     * @param string $value The email address.
     */
    public function setEmail($value)
    {
        $this->email = $value;
    }       

    /**
     * @return string The password.
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * @param string $value The password.
     */
    public function setPassword($value)
    {
        $this->password = $value;
    }

    /**
     * @return string The salt.
     */
    public function getSalt()
    {
        return $this->salt;
    }

    /**
     * @param string $value The salt.
     */
    public function setSalt($value)
    {
        $this->salt = $value;
    }

    /**
     * @return ArrayCollection A Doctrine ArrayCollection
     */
    public function getUserRoles()
    {
        return $this->userRoles;
    }

    /**
     * Constructs a new instance of User
     */
    public function __construct()
    {
        $this->userRoles = new ArrayCollection();
        $this->createdAt = new \DateTime();
    }

    /**
     * Erases the user credentials.
     */
    public function eraseCredentials()
    {

    }

    /**
     * @return array An array of Role objects
     */
    public function getRoles()
    {
        return $this->getUserRoles()->toArray();
    }

    /**
     * Compares this user to another to determine if they are the same.
     * 
     * @param UserInterface $user The user
     * @return boolean True if equal, false othwerwise.
     */
    public function equals(UserInterface $user)
    {
        return md5($this->getUsername()) == md5($user->getUsername());
    } 
}

login.html.twig 的重要部分如下所示:

        <label for="_username">Username:</label>
            <input type="text" name="_username" id="username" value="{{ last_username }}"/>
        <label for="_password">Password:</label>
            <input type="password" name="_password" id="password"/>

而用戶是這樣創建的:

    $role = new Role();
    $role->setName('ROLE_ADMIN');

    $role1 = new Role();
    $role1->setName('ROLE_CUSTOMER');


$role2 = new Role();
$role2->setName('ROLE_SALESMAN');       

$role3 = new Role();
$role3->setName('ROLE_CONTENT_ADMIN');              

$manager->persist($role); 
    $manager->persist($role1); 
    $manager->persist($role2); 
    $manager->persist($role3); 

$user = new User();
$user->setFirstName('FirstName');
$user->setLastName('LastName');
$user->setEmail('lulz@roflmao.com');
$user->setUsername('admin');
$user->setSalt(md5(time()));

$encoder = new MessageDigestPasswordEncoder('sha512', true, 3);
$password = $encoder->encodePassword('admin', $user->getSalt());
$user->setPassword($password);

$user->getUserRoles()->add($role);


    $manager->persist($user);
$manager->flush();

我沒有時間檢查您的所有代碼,但我看到兩件事:1)您的用戶“user”將無法登錄,因為您給了他一個密碼:“userpass”雖然您已將密碼設置為3 次 sha512 編碼,然后 base64 編碼。 您應該對密碼進行編碼,然后使用設置文件中的編碼。 2) 我在使用 'encode-as-base64: true' 時遇到問題。 如果您在解決第一個問題后無法登錄,請嘗試使用“encode-as-base64: false”。 當然,這次您必須提供未編碼為 base64 的密碼。

希望這可以幫助。

暫無
暫無

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

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