mohamedallou / mezzio-security
提供基本用户认证功能的中间件和服务集
v0.6
2024-07-26 07:19 UTC
Requires
- php: >= 8.2
- doctrine/orm: ^3
- firebase/php-jwt: ^6.8
- laminas/laminas-diactoros: ^3.3
- laminas/laminas-eventmanager: ^3.13
- laminas/laminas-hydrator: ^4.15
- laminas/laminas-inputfilter: ^2.30
- laminas/laminas-servicemanager: ^3.22
- laminas/laminas-stratigility: ^3.11
- mezzio/mezzio: ^3.19
- mezzio/mezzio-authentication: ^1.9
- mezzio/mezzio-authentication-basic: ^1.8
- mezzio/mezzio-authentication-session: ^1.9
- mezzio/mezzio-authorization: ^1.9
- mezzio/mezzio-helpers: ^5.16
- mezzio/mezzio-problem-details: ^1.14
- mezzio/mezzio-session: ^1.14
- mezzio/mezzio-session-ext: ^1.19
- mezzio/mezzio-template: ^2.10
- nesbot/carbon: ^3.6
- psr/container: ^2.0 || ^1.0
- psr/http-server-handler: ^1.0
- symfony/cache: ^7.1
- symfony/console: ^7.0
Requires (Dev)
- laminas/laminas-config-aggregator: ^1.15
- mezzio/mezzio-fastroute: ^3.11
- mezzio/mezzio-laminasviewrenderer: ^2.15
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^11.2
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 注释