Skip to content

Commit a73998f

Browse files
authored
Drop support for Symfony 3.4 and 5.3, add support for Symfony 6, drop MongoDB ODM 1.x (lexik#284)
* Drop support for Symfony 3.4 and add support for Symfony 6, and drop support for MongoDB ODM 1.x * Misc. README updates
1 parent e057fa2 commit a73998f

36 files changed

+402
-348
lines changed

.gitattributes

-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
/.github export-ignore
2-
/spec export-ignore
32
/Tests export-ignore
43
/.gitignore export-ignore
54
/CHANGELOG.md export-ignore
6-
/phpspec.yml export-ignore
75
/phpunit.xml.dist export-ignore
86
/README.md export-ignore

.github/workflows/run-tests.yml

+11-17
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,20 @@ jobs:
99
strategy:
1010
fail-fast: false
1111
matrix:
12-
php: [7.4, 8.0]
13-
symfony: [3.4.*, 4.4.*, 5.2.*, 5.3.*]
12+
php: ['7.4', '8.0', '8.1']
13+
symfony: ['4.4.*', '5.4.*', '6.0.*']
1414
composer-flags: ['--prefer-stable']
1515
can-fail: [false]
1616
extensions: ['curl, iconv, mbstring, mongodb, pdo, pdo_sqlite, sqlite, zip']
1717
include:
18-
- php: 7.4
19-
symfony: 3.4.*
18+
- php: '7.4'
19+
symfony: '4.4.*'
2020
composer-flags: '--prefer-stable --prefer-lowest'
2121
can-fail: false
2222
extensions: 'curl, iconv, mbstring, mongodb, pdo, pdo_sqlite, sqlite, zip'
23-
- php: 8.0
24-
symfony: 5.4.*@dev
25-
composer-flags: ''
26-
can-fail: true
27-
extensions: 'curl, iconv, mbstring, mongodb, pdo, pdo_sqlite, sqlite, zip'
28-
- php: 8.1
29-
symfony: 5.3.*
30-
composer-flags: '--ignore-platform-req=php'
31-
can-fail: true
32-
extensions: 'curl, iconv, mbstring, mongodb-1.11.0alpha1, pdo, pdo_sqlite, sqlite, zip'
3323
exclude:
34-
- php: 8.0
35-
symfony: 3.4.*
24+
- php: '7.4'
25+
symfony: '6.0.*'
3626

3727
name: "PHP ${{ matrix.php }} - Symfony ${{ matrix.symfony }}${{ matrix.composer-flags != '' && format(' - Composer {0}', matrix.composer-flags) || '' }}"
3828

@@ -58,9 +48,13 @@ jobs:
5848
id: setup-mongodb
5949
uses: mongodb-labs/drivers-evergreen-tools@master
6050
with:
61-
version: 4.4
51+
version: '4.4'
6252
topology: server
6353

54+
- name: Remove Guard
55+
if: matrix.symfony == '6.0.*'
56+
run: composer remove --dev --no-update symfony/security-guard
57+
6458
- name: Install dependencies
6559
run: composer update ${{ matrix.composer-flags }} --prefer-dist --no-suggest
6660
env:

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## Unreleased
44

5+
- Dropped support for MongoDB ODM 1.x
6+
- Dropped support for Symfony 3.4
7+
- Added support for Symfony 6.0
8+
9+
## 1.0.0-beta4
10+
511
- Added `Gesdinet\JWTRefreshTokenBundle\Doctrine\RefreshTokenRepositoryInterface`
612
- `Gesdinet\JWTRefreshTokenBundle\Doctrine\RefreshTokenManager` now requires all object repositories implement `Gesdinet\JWTRefreshTokenBundle\Doctrine\RefreshTokenRepositoryInterface`
713

DependencyInjection/Configuration.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class Configuration implements ConfigurationInterface
2121
public function getConfigTreeBuilder(): TreeBuilder
2222
{
2323
$treeBuilder = new TreeBuilder('gesdinet_jwt_refresh_token');
24-
$rootNode = method_exists(TreeBuilder::class, 'getRootNode') ? $treeBuilder->getRootNode() : $treeBuilder->root('gesdinet_jwt_refresh_token');
24+
$rootNode = $treeBuilder->getRootNode();
2525

2626
$rootNode
2727
->children()

DependencyInjection/GesdinetJWTRefreshTokenExtension.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111

1212
namespace Gesdinet\JWTRefreshTokenBundle\DependencyInjection;
1313

14-
use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass;
14+
use Doctrine\ODM\MongoDB\DocumentManager;
15+
use Doctrine\ORM\EntityManager;
1516
use Gesdinet\JWTRefreshTokenBundle\Document\RefreshToken as RefreshTokenDocument;
1617
use Gesdinet\JWTRefreshTokenBundle\Entity\RefreshToken as RefreshTokenEntity;
1718
use Gesdinet\JWTRefreshTokenBundle\Request\Extractor\ExtractorInterface;
@@ -44,7 +45,8 @@ public function load(array $configs, ContainerBuilder $container): void
4445
$refreshTokenClass = RefreshTokenEntity::class;
4546
$objectManager = 'doctrine.orm.entity_manager';
4647

47-
if (!class_exists(DoctrineOrmMappingsPass::class) || 'mongodb' === strtolower($config['manager_type'])) {
48+
// Change the refresh token and object manager to the MongoDB ODM if the configuration explicitly sets it or if the ORM is not installed and the MongoDB ODM is
49+
if ('mongodb' === strtolower($config['manager_type']) || (!class_exists(EntityManager::class) && class_exists(DocumentManager::class))) {
4850
$refreshTokenClass = RefreshTokenDocument::class;
4951
$objectManager = 'doctrine_mongodb.odm.document_manager';
5052
}

DependencyInjection/Security/Factory/LegacyRefreshTokenAuthenticatorFactory.php

-34
This file was deleted.

DependencyInjection/Security/Factory/RefreshTokenAuthenticatorFactory.php

+2-8
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@
1818
use Symfony\Component\DependencyInjection\Parameter;
1919
use Symfony\Component\DependencyInjection\Reference;
2020

21-
/**
22-
* @final
23-
*/
24-
/* final */ class RefreshTokenAuthenticatorFactory implements AuthenticatorFactoryInterface
21+
final class RefreshTokenAuthenticatorFactory implements AuthenticatorFactoryInterface
2522
{
2623
public function getPriority(): int
2724
{
@@ -59,10 +56,7 @@ public function addConfiguration(NodeDefinition $builder): void
5956
;
6057
}
6158

62-
/**
63-
* @return string
64-
*/
65-
public function createAuthenticator(ContainerBuilder $container, string $firewallName, array $config, string $userProviderId)
59+
public function createAuthenticator(ContainerBuilder $container, string $firewallName, array $config, string $userProviderId): string
6660
{
6761
$authenticatorId = 'security.authenticator.refresh_jwt.'.$firewallName;
6862

Doctrine/RefreshTokenManager.php

+5-2
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,15 @@ class RefreshTokenManager implements RefreshTokenManagerInterface
4141
public function __construct(ObjectManager $om, $class)
4242
{
4343
$this->objectManager = $om;
44-
$this->repository = $om->getRepository($class);
4544

46-
if (!$this->repository instanceof RefreshTokenRepositoryInterface) {
45+
$repository = $om->getRepository($class);
46+
47+
if (!$repository instanceof RefreshTokenRepositoryInterface) {
4748
throw new \LogicException(sprintf('Repository mapped for "%s" should implement %s.', $class, RefreshTokenRepositoryInterface::class));
4849
}
4950

51+
$this->repository = $repository;
52+
5053
$metadata = $om->getClassMetadata($class);
5154
$this->class = $metadata->getName();
5255
}

Document/RefreshTokenRepository.php

+3-27
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,14 @@
22

33
namespace Gesdinet\JWTRefreshTokenBundle\Document;
44

5-
use Doctrine\ODM\MongoDB\DocumentRepository;
6-
use Doctrine\ODM\MongoDB\Repository\DocumentRepository as MongoDBDocumentRepository;
5+
use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
76
use Gesdinet\JWTRefreshTokenBundle\Doctrine\RefreshTokenRepositoryInterface;
87

9-
if (class_exists(MongoDBDocumentRepository::class)) {
10-
/**
11-
* Internal repository supporting doctrine/mongodb-odm >=2.0.
12-
*
13-
* @template T of object
14-
* @extends MongoDBDocumentRepository<T>
15-
*
16-
* @internal
17-
*/
18-
class BaseRepository extends MongoDBDocumentRepository
19-
{
20-
}
21-
} else {
22-
/**
23-
* Internal repository supporting doctrine/mongodb-odm <2.0.
24-
*
25-
* @internal
26-
*/
27-
class BaseRepository extends DocumentRepository
28-
{
29-
}
30-
}
31-
328
/**
33-
* @extends BaseRepository<RefreshToken>
9+
* @extends DocumentRepository<RefreshToken>
3410
* @implements RefreshTokenRepositoryInterface<RefreshToken>
3511
*/
36-
class RefreshTokenRepository extends BaseRepository implements RefreshTokenRepositoryInterface
12+
class RefreshTokenRepository extends DocumentRepository implements RefreshTokenRepositoryInterface
3713
{
3814
/**
3915
* @param \DateTimeInterface|null $datetime

Event/Event.php

-28
This file was deleted.

Event/RefreshAuthenticationFailureEvent.php

+5-4
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313

1414
use Symfony\Component\HttpFoundation\Response;
1515
use Symfony\Component\Security\Core\Exception\AuthenticationException;
16+
use Symfony\Contracts\EventDispatcher\Event;
1617

1718
class RefreshAuthenticationFailureEvent extends Event
1819
{
1920
private AuthenticationException $exception;
2021

21-
private ?Response $response;
22+
private Response $response;
2223

23-
public function __construct(AuthenticationException $exception, ?Response $response = null)
24+
public function __construct(AuthenticationException $exception, Response $response)
2425
{
2526
$this->exception = $exception;
2627
$this->response = $response;
@@ -31,12 +32,12 @@ public function getException(): AuthenticationException
3132
return $this->exception;
3233
}
3334

34-
public function getResponse(): ?Response
35+
public function getResponse(): Response
3536
{
3637
return $this->response;
3738
}
3839

39-
public function setResponse(?Response $response = null): void
40+
public function setResponse(Response $response): void
4041
{
4142
$this->response = $response;
4243
}

Event/RefreshEvent.php

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenInterface;
1515
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
16+
use Symfony\Contracts\EventDispatcher\Event;
1617

1718
class RefreshEvent extends Event
1819
{

Event/RefreshTokenNotFoundEvent.php

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\HttpFoundation\Response;
1515
use Symfony\Component\Security\Core\Exception\AuthenticationException;
16+
use Symfony\Contracts\EventDispatcher\Event;
1617

1718
class RefreshTokenNotFoundEvent extends Event
1819
{

EventListener/AttachRefreshTokenOnSuccessListener.php

+7-5
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,7 @@ class AttachRefreshTokenOnSuccessListener
5757
*/
5858
protected $extractor;
5959

60-
/**
61-
* @var array
62-
*/
63-
protected $cookieSettings;
60+
protected array $cookieSettings;
6461

6562
/**
6663
* @param int $ttl
@@ -85,6 +82,7 @@ public function __construct(
8582
$this->refreshTokenGenerator = $refreshTokenGenerator;
8683
$this->extractor = $extractor;
8784
$this->cookieSettings = array_merge([
85+
'enabled' => false,
8886
'same_site' => 'lax',
8987
'path' => '/',
9088
'domain' => null,
@@ -105,6 +103,10 @@ public function attachRefreshToken(AuthenticationSuccessEvent $event): void
105103
$data = $event->getData();
106104
$request = $this->requestStack->getCurrentRequest();
107105

106+
if (null === $request) {
107+
return;
108+
}
109+
108110
// Extract refreshToken from the request
109111
$refreshTokenString = $this->extractor->getRefreshToken($request, $this->tokenParameterName);
110112

@@ -130,7 +132,7 @@ public function attachRefreshToken(AuthenticationSuccessEvent $event): void
130132
}
131133

132134
// Add a response cookie if enabled
133-
if (isset($this->cookieSettings['enabled']) && $this->cookieSettings['enabled']) {
135+
if ($this->cookieSettings['enabled']) {
134136
$event->getResponse()->headers->setCookie(
135137
new Cookie(
136138
$this->tokenParameterName,

GesdinetJWTRefreshTokenBundle.php

+2-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use Gesdinet\JWTRefreshTokenBundle\DependencyInjection\Compiler\CustomUserProviderCompilerPass;
77
use Gesdinet\JWTRefreshTokenBundle\DependencyInjection\Compiler\ObjectManagerCompilerPass;
88
use Gesdinet\JWTRefreshTokenBundle\DependencyInjection\Compiler\UserCheckerCompilerPass;
9-
use Gesdinet\JWTRefreshTokenBundle\DependencyInjection\Security\Factory\LegacyRefreshTokenAuthenticatorFactory;
109
use Gesdinet\JWTRefreshTokenBundle\DependencyInjection\Security\Factory\RefreshTokenAuthenticatorFactory;
1110
use Symfony\Bundle\SecurityBundle\DependencyInjection\SecurityExtension;
1211
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -24,16 +23,11 @@ public function build(ContainerBuilder $container): void
2423
$container->addCompilerPass(new ObjectManagerCompilerPass());
2524
$container->addCompilerPass(new UserCheckerCompilerPass(true));
2625

27-
// Only register the security authenticator for Symfony 5.3+
26+
// Only register the security authenticator for Symfony 5.4+
2827
if (interface_exists(RememberMeHandlerInterface::class)) {
2928
/** @var SecurityExtension $extension */
3029
$extension = $container->getExtension('security');
31-
32-
if (method_exists($extension, 'addAuthenticatorFactory')) {
33-
$extension->addAuthenticatorFactory(new RefreshTokenAuthenticatorFactory());
34-
} else {
35-
$extension->addSecurityListenerFactory(new LegacyRefreshTokenAuthenticatorFactory());
36-
}
30+
$extension->addAuthenticatorFactory(new RefreshTokenAuthenticatorFactory());
3731
}
3832
}
3933
}

0 commit comments

Comments
 (0)