feat(security): emit authentication failures for firewall handling
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
||||
namespace KTXC\Service;
|
||||
|
||||
use KTXC\Http\Request\Request;
|
||||
use KTXC\Http\Request\RequestContext;
|
||||
use KTXC\Models\Firewall\FirewallRuleObject;
|
||||
use KTXC\Models\Firewall\FirewallLogObject;
|
||||
use KTXC\Stores\FirewallStore;
|
||||
@@ -12,6 +13,7 @@ use KTXC\Context\TenantContextInterface;
|
||||
use KTXC\Security\Event\AuthenticationFailedEvent;
|
||||
use KTXC\Security\Event\SecurityEvent;
|
||||
use KTXC\Security\Event\SecurityEventInterface;
|
||||
use KTXC\Security\Event\SecurityRequestEventInterface;
|
||||
use KTXF\Event\EventDispatcherInterface;
|
||||
use KTXF\IpUtils;
|
||||
|
||||
@@ -47,6 +49,7 @@ class FirewallService
|
||||
private readonly EventDispatcherInterface $events,
|
||||
private readonly FirewallRuleManager $rules,
|
||||
private readonly FirewallRuleCache $ruleCache,
|
||||
private readonly RequestContext $requestContext,
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -134,14 +137,15 @@ class FirewallService
|
||||
*/
|
||||
public function handleAuthFailure(AuthenticationFailedEvent $event): void
|
||||
{
|
||||
$ipAddress = $event->getIpAddress();
|
||||
$request = $this->requestContext->current();
|
||||
$ipAddress = $request?->getClientIp();
|
||||
$tenantId = $event->getTenantId() ?? $this->tenantContext->identifier();
|
||||
|
||||
if (!$ipAddress || !$tenantId) {
|
||||
return;
|
||||
}
|
||||
|
||||
$log = $this->securityLog($event);
|
||||
$log = $this->securityLog($event, $request);
|
||||
if ($log === null || !$this->store->createLogOnce($log)) {
|
||||
return;
|
||||
}
|
||||
@@ -235,7 +239,10 @@ class FirewallService
|
||||
}
|
||||
}
|
||||
|
||||
private function securityLog(SecurityEventInterface $event): ?FirewallLogObject
|
||||
private function securityLog(
|
||||
SecurityEventInterface $event,
|
||||
?Request $request = null,
|
||||
): ?FirewallLogObject
|
||||
{
|
||||
$tenantId = $event->getTenantId() ?? $this->tenantContext->identifier();
|
||||
$ruleScope = $event->get('ruleScope');
|
||||
@@ -243,14 +250,19 @@ class FirewallService
|
||||
return null;
|
||||
}
|
||||
|
||||
$requestEvent = $event instanceof SecurityRequestEventInterface ? $event : null;
|
||||
|
||||
$log = new FirewallLogObject();
|
||||
return $log->setEventId($event->getEventId())
|
||||
->setTenantId($tenantId)
|
||||
->setIpAddress($event->getIpAddress())
|
||||
->setDeviceFingerprint($event->getDeviceFingerprint())
|
||||
->setUserAgent($event->getUserAgent())
|
||||
->setRequestPath($event->getRequestPath())
|
||||
->setRequestMethod($event->getRequestMethod())
|
||||
->setIpAddress($request?->getClientIp() ?? $requestEvent?->getIpAddress())
|
||||
->setDeviceFingerprint(
|
||||
$request?->headers->get('X-Device-Fingerprint')
|
||||
?? $requestEvent?->getDeviceFingerprint()
|
||||
)
|
||||
->setUserAgent($request?->headers->get('User-Agent') ?? $requestEvent?->getUserAgent())
|
||||
->setRequestPath($request?->getPathInfo() ?? $requestEvent?->getRequestPath())
|
||||
->setRequestMethod($request?->getMethod() ?? $requestEvent?->getRequestMethod())
|
||||
->setEventType($this->mapEventToLogType($event->getName()))
|
||||
->setResult($this->mapEventToResult($event))
|
||||
->setRuleId($event->get('ruleId'))
|
||||
|
||||
Reference in New Issue
Block a user