当前位置: 首页 > 知识库问答 >
问题:

使用用户实体的Symfony 4基本http身份验证

乜栋
2023-03-14

首先,我尝试了使用内存Provider的简单方法,如本文档中所示:https://symfony.com/doc/current/security.html 这对我很有效,然后我继续学习本教程:https://symfony.com/doc/current/security/entity_provider.html 并最终在浏览器http基本用户数据请求的无休止循环中结束。

这是我的代码,也许有人能找到丢失的小分号: D

URL:https://gitlab.com/AceVik/ajoli

必需的文件。security.yml

security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
    our_db_provider:
         entity:
            class: App\Entity\User
    #        property: username
    #in_memory:
    #    memory:
    #        users:
    #            admin:
    #                password: admin
    #                roles: 'ROLE_ADMIN'
firewalls:
    #secured_area:
    #    logout:
    #        path: /logout
    #        target: /
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
    #    pattern:    ^/
        http_basic: ~
        provider: our_db_provider
   #     provider: in_memory
encoders:
    App\Entity\User: plaintext
    #    algorithm: bcrypt
    #    cost: 12
    #Symfony\Component\Security\Core\User\User: plaintext

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
     - { path: ^/admin, roles: ROLE_ADMIN }
     - { path: ^/profile, roles: ROLE_USER }

User.php

<?php

declare(strict_types=1);

namespace App\Entity;

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

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

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

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

    /**
     * @ORM\Column(type="string", length=254, unique=true)
     */
    private $email;

    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    private $isActive;

    public function __construct()
    {
        $this->isActive = true;
        // may not be needed, see section on salt below
        // $this->salt = md5(uniqid('', true));
    }

    public function getUsername()
    {
        return $this->username;
    }

    public function setUsername($username) {
        $this->username = $username;
        $this->email = $username . '@example.com';
    }

    public function setPassword($password) {
        $this->password = $password;
    }

    public function getSalt()
    {
        // you *may* need a real salt depending on your encoder
        // see section on salt below
        return null;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function getRoles()
    {
        return array('ROLE_USER');
    }

    public function eraseCredentials()
    {
    }

    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt,
        ));
    }

    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt
            ) = unserialize($serialized, ['allowed_classes' => false]);
    }
}

UserRepository.php

<?php

namespace App\Repository;

use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;

class UserRepository extends ServiceEntityRepository implements UserLoaderInterface
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, User::class);
    }

    public function loadUserByUsername($username)
    {
        return $this->createQueryBuilder('u')
            ->where('u.username = :username')
            ->setParameter('username', $username)
            ->getQuery()
            ->getOneOrNullResult();
    }
}

共有2个答案

施晗昱
2023-03-14

找到解决方案

我刚刚将Symfony从4.0.9更新到4.0.11,它解决了这个问题。看起来,这是一个Symfony bug:https://symfony.com/blog/symfony-4-0-11-released

现在我有一个问题与注销: D我试图修复它由我自己,但如果有人看到错误,告诉我请。我的gitlab存储库仍然是公共的。

侯沈义
2023-03-14

维克多,

你的形象似乎有问题。我加载了自己的docker图像,它对我有效。

要调试,您可以打开BasicAuthentiationListener(在供应商目录中搜索它)。并设置一个断点,在}cat上(身份验证异常$e){或添加退出(var_dump($e));在它下面检查抛出了什么异常。

 类似资料:
  • 问题内容: 如何在Golang网站上实施基本身份验证?这样,当有人访问某个页面时,他们的 浏览器 会提示他们登录。 问题答案: 为了强制用户进行身份验证/在用户浏览器中显示基本身份验证提示,请发送标头 因此,如果您有通话,您可以 这将导致浏览器打开您所指的提示。

  • 问题内容: 以下代码成功连接到我的Ruby on Rails API,并使用AFNetworking返回JSON。我需要做什么来进行编辑以传递用户名和密码,以便我的API可以使用HTTP基本身份验证? 我已经阅读了他们的文档,但是我对Objective-C和AFNetworking还是陌生的,目前还没有意义。 问题答案: AFNetworking 2.x的答案已更新 对于AFNetworking

  • 问题内容: 我已经使用JAX-RS,Jersey和Grizzly编写了一个简单的REST服务器。这是我启动服务器的方式: 现在,我需要使用基本HTTP身份验证来保护资源,而且我不知道该怎么做。 如果可以更轻松地使它工作,我可以从Grizzly切换到Jetty,但是我确实很看重Grizzly提供的简单配置/启动。 我读了很多教程。他们都提到了web.xml,但是在我当前的配置中我没有一个。(我需要为

  • 我尝试了angular.js,并从一个restful api的web-ui开始(使用超文本传输协议基本授权)。这真的很好,除了授权工作。 到目前为止,我使用的是设置密码,但大多数情况下浏览器会打开http basic auth的默认登录表单。另一个奇怪的行为是angular请求不包含授权头(选项和GET请求都不包含)。我还尝试使用header配置在每个请求上设置此header,但这也不起作用。 有

  • 问题内容: 用Express v3实现基本的HTTP身份验证似乎很简单: 不过,第4版(我使用的是4.2)删除了中间件,所以我有点卡住了。我有以下代码,但是它不会导致浏览器提示用户输入凭据,这就是我想要的(以及我想象的旧方法所做的): 问题答案: 我使用原始代码查找答案:

  • 问题内容: 使用基本身份验证进行身份验证时遇到问题。我正在使用符合协议的标准枚举来构造我的请求。问题是,当我在枚举中手动设置授权标头时,如下所示: 我总是收到401未经授权的回复。 但是, 如果我像这样使用回调设置密码: 它正确认证。我希望能够在符合的枚举中手动进行设置,而不是在中传递凭据。 我知道它正在使用身份验证挑战的后台,但我希望能够手动设置它。 这是我的实现: 问题答案: 最终弄清楚了问题