mohamedallou/mezzio-security

提供基本用户认证功能的中间件和服务集


README

此库提供了与认证适配器一起使用的 UserRepositoryInterface 的实现,为 mezzio 认证提供持久层。

它还处理授权并实现了一个简单的扁平权限系统。

此库还提供了 PhpSessionPersistenceInterface 的实现。

配置

您需要将以下配置提供者类添加到您的模块列表中

\Laminas\InputFilter\ConfigProvider::class
\Mezzio\LaminasView\ConfigProvider::class,
Mezzio\Session\ConfigProvider,
\Mezzio\Authentication\ConfigProvider,
\Mezzio\Authentication\Session\ConfigProvider::class,

如果它们没有自动添加。

当然还有当前的 ConfigProvider: \MezzioSecurity\ConfigProvider

您还需要在全局配置中配置 laminas 抽象工厂

\Laminas\ServiceManager\AbstractFactory\ConfigAbstractFactory::class,

需要 Laminas EventManager 的实现。

例如:

<?php

declare(strict_types=1);

namespace App\Factory;

use Laminas\EventManager\EventManager;
use Laminas\EventManager\EventManagerAwareInterface;
use Laminas\EventManager\LazyListener;
use Psr\Container\ContainerInterface;

class EventManagerFactory
{
    public function __invoke(ContainerInterface $container): EventManager
    {
        $events = $container->get('config')['events'] ?? [];

        $eventManager = new EventManager();

        foreach ($events as $eventName => $listenerClasses) {
            if (!is_string($eventName)) {
                continue;
            }

            $listenerClasses = is_array($listenerClasses) ? $listenerClasses : [$listenerClasses];
            foreach ($listenerClasses as $listenerClass) {
                //TODO: use LazyEvent Listener

                if (is_a($listenerClass, EventManagerAwareInterface::class, true)) {
                    /** @var callable&EventManagerAwareInterface $listener */
                    $listener = $container->get($listenerClass);
                    $listener->setEventManager($eventManager);
                } else {
                    $listener = new LazyListener(
                        [
                            'listener' => $listenerClass,
                            'method' => '__invoke'
                        ],
                        $container
                    );
                }

                if (!is_callable($listener)) {
                    continue;
                }

                $eventManager->attach($eventName, $listener);
            }
        }
        return $eventManager;
    }
}

该库处理登录和用户管理。

需要注意的是,登录数据必须以 URL 编码或 multipart 格式提交,否则我们需要使用 ParsedBody 中间件。

并且我们必须在路由中间件之前将 session 中间件管路

$app->pipe(\Mezzio\Session\SessionMiddleware::class);
$app->pipe(\Mezzio\Router\Middleware\RouteMiddleware::class);

要求

此库需要一个 Doctrine\ORM\EntityManagerInterface 的实现。

向 Problemdetails 监听器添加翻译

即将推出的功能

  • 同时支持会话和基本认证
  • 支持验证消息的翻译
  • 添加 JWT Token 认证和黑名单
  • 添加 IP 限制
  • 添加 IP 日志
  • 在 x 次失败登录尝试后阻止用户
  • 添加 Openapi 注释