繁体   English   中英

没有Doctrine的Symfony2身份验证(登录)?

[英]Symfony2 Authentication (Login) without Doctrine?

我是新的@ symfony,并且在学说上绝对是新的。 在symfony页面上有一个关于在sf2中构建登录过程的教程。 而且我喜欢它,但我不能与学说合作,我不想与它一起工作(有许多人认为不适用于学说...... - 例如enum's等)。

我如何创建登录控制器,防火墙设置等..解释得非常好。 但! 我想创建它没有教条...我有一个现有的数据库,我喜欢简单的SQL。 :-)

如何在UserInterface中使用普通的sql ...这将与sf2的内置登录一起使用?

多谢...

你想要做的是插入你自己的UserProvider:

http://symfony.com/doc/current/cookbook/security/entity_provider.html

您可以考虑使用Doctrine 2数据库访问层(DBAL)代替Doctrine 2对象关系管理器(ORM)。 这是一个构建在PDO之上的瘦sql层。 有一些帮助程序用于构建SQL。

http://symfony.com/doc/current/cookbook/doctrine/dbal.html

当然你可以直接使用PDO:

http://symfony.com/doc/current/cookbook/configuration/pdo_session_storage.html

这是我在Symfony 3.0上提出的解决方案。

当我实现一个现有的postgresql数据库并且我想重用大量已经存在的PHP代码时,ORM不适合我的情况 (进行逆向工程的时间太多)。 因此,我一直在积极地搜索如何在没有ORM的情况下使用Symfony (我确实实现了DBAL,因为我为PDO编写的内容适用于它...到目前为止......还有一些小修复)。

让我们开始:我需要理解的重要概念来自这个页面: http//symfony.com/doc/current/cookbook/security/custom_provider.html +有关security.yml文件的所有内容。

关于安全文件,我花了一些时间才明白节点“提供者”只有两个本机选项:“实体”或“内存” 对于'实体' ,一个人必然会与ORM合作 所以我发现我需要开发自己的提供程序,可以使用常规PDO

在这里,我的代码的一些部分可以让您了解我最终如何使其工作,您将在下面找到以下文件:

  • security.yml(这里可能还有一些改进空间,因为我没有过多地挖掘'防火墙'部分组织);
  • CustomUsersProvider.php:实现接口UserProviderInterface的类(类PdoCustom及其方法getUser()是我自己的PDO烹饪,用于从我的数据库中检索用户);
  • services.yml:提供对类CustomUsersProvider的访问并因此提供对安全文件中“提供者”的访问的服务(如果我正确理解它),我将DBAL数据库配置作为服务中的参数传递,以便可以使用它在我的对象CustomUsersProvider的实例中;
  • CustomUsers.php:一个充当我的表'custom_users'的实体的类,用于处理PDO :: FETCH_CLASS类型的PDO fetch; 它实现了Symfony接口:UserInterface和EquatableInterface;
  • 您仍然必须实现Symfony Controller SecurityController(在此处找到它: http//symfony.com/doc/2.0/book/security.html )及其到/ login和Twig文件的路由。
  • 您可能会注意到在阅读$ email用作$ username的代码时;

[项目] \\应用\\配置\\ security.yml

encoders:
    CustomBundle\Entity\CustomUsers:
       algorithm: [enter an encoding algorithm, eg: MD5, sha512, etc.]

role_hierarchy:
    ROLE_NAME2: ROLE_NAME1
    ROLE_NAME3: ROLE_NAME2

providers:
    custom_users_provider:
        id: custom_users_provider

firewalls:
    main_login:
        pattern: ^/login$
        anonymous: ~
    main:
      pattern: ^/
      anonymous: true
      provider: custom_users_provider
      form_login:
         check_path: /login_check
         login_path: /login
         provider: custom_users_provider
         username_parameter: email
         password_parameter: password

       logout: true

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/secured_for_role_name, role: ROLE_NAME }

[项目] \\ CustomBundle \\安全\\ CustomUsersProvider.php

<?php
namespace CustomBundle\Security;

use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;

use CustomBundle\DependencyInjection\PdoCustom;
use CustomBundle\Entity\CustomUsers;


class CustomUsersProvider implements UserProviderInterface
{
    private $dbalConnection;
    private $logger;

    public function __construct($dbalConnection){
        $this->dbalConnection = $dbalConnection;

        ////////////////EASTER EGG//////////////////////////
        $this->logger = $GLOBALS['kernel']->getContainer()->get('logger');
        $logger->info('EASTER EGG: YOU CAN ADD LOG THAT CAN BE FOUND UNDER [projectname]\var\logs\dev.log WHEN LAUNCHING THRU app_dev.php, WICH COULD BE USEFUL TOO');
        ////////////////////////////////////////////////////
    }


    public function loadUserByUsername($username)
    {
        $PdoCustom = new PdoCustom($this->dbalConnection);
        $userData = $PdoCustom->getUser($username);


        if ($userData) {

            $password = $userData->password;
            $salt = null;
            $role = $userData->role;

            $resToReturn = new CustomUsers();
            $resToReturn->setCharact($username, $password, $role);
            return $resToReturn;
        }

        throw new UsernameNotFoundException(
            sprintf('Username "%s" does not exist.', $username)
        );
    }

    public function refreshUser(UserInterface $user)
    {
        if (!$user instanceof CustomUsers) {
            throw new UnsupportedUserException(
                sprintf('Instances of "%s" are not supported.', get_class($user))
            );
        }
        return $this->loadUserByUsername($user->getUsername());
    }

    public function supportsClass($class)
    {
        return $class === 'CustomBundle\Entity\CustomUsers';
    }
}
?>

[项目] \\ SRC \\ CustomBundle \\ Ressources \\配置\\ services.yml

custom_bundle.custom_users_provider.class : CustomBundle\Security\CustomUsersProvider

custom_users_provider:
                 class: %custom_bundle.custom_users_provider.class%
                 arguments: ["@doctrine.dbal.default_connection"]

[项目] \\ CustomBundle \\实体\\ CustomUsers.php

  <?php
namespace CustomBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\EquatableInterface;

class CustomUsers implements UserInterface, EquatableInterface {

public $email;
public $password;
public $role;

public function __construct(){
}

public function setCharact($email,$password,$role){
    $this->email = $email;
    $this->password = $password;
    $this->status = $status;

}


public function getRoles(){
    return $this->role;

}
public function getPassword(){
    return $this->password;
}
public function getSalt(){
    return null;
}
public function getUsername(){
    return $this->email;
}
public function eraseCredentials(){
}   
public function isEqualTo(UserInterface $user)
{
    if (!$user instanceof CustomUsers) {
        return false;
    }

    if ($this->user_password !== $user->getPassword()) {
        return false;
    }

    //if ($this->salt !== $user->getSalt()) {
    //    return false;
    //}

    if ($this->email !== $user->getUsername()) {
        return false;
    }

    return true;
}
}
?>

就是这样,你还有一些工作可以自己解决这个问题,但我希望这会给你指示我很难找到如何没有ORM的情况下使用SYMFONY :))

在Symfony文档中,所有内容都在安全性章节中进行了解释。 安全

在本章的开头,所有授权都是在没有Doctrine的情况下完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM