Skip to content

Commit f03b72b

Browse files
committed
SecurityExtension: added section 'authentication'
1 parent 3ad299d commit f03b72b

4 files changed

Lines changed: 36 additions & 5 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"nette/utils": "^3.1"
2020
},
2121
"require-dev": {
22-
"nette/di": "^3.0.0",
22+
"nette/di": "^3.0.1",
2323
"nette/http": "^3.0.0",
2424
"nette/tester": "^2.0",
2525
"tracy/tracy": "^2.4",

src/Bridges/SecurityDI/SecurityExtension.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ public function getConfigSchema(): Nette\Schema\Schema
4444
),
4545
'roles' => Expect::arrayOf('string|array|null')->deprecated(), // role => parent(s)
4646
'resources' => Expect::arrayOf('string|null')->deprecated(), // resource => parent
47+
'authentication' => Expect::structure([
48+
'storage' => Expect::anyOf('session', 'cookie')->default('session'),
49+
'expiration' => Expect::string()->dynamic(),
50+
'cookieName' => Expect::string(),
51+
'cookieDomain' => Expect::string(),
52+
'cookieSamesite' => Expect::anyOf('Lax', 'Strict', 'None'),
53+
]),
4754
]);
4855
}
4956

@@ -57,9 +64,20 @@ public function loadConfiguration()
5764
$builder->addDefinition($this->prefix('passwords'))
5865
->setFactory(Nette\Security\Passwords::class);
5966

67+
$auth = $config->authentication;
6068
$storage = $builder->addDefinition($this->prefix('userStorage'))
6169
->setType(Nette\Security\UserStorage::class)
62-
->setFactory(Nette\Bridges\SecurityHttp\SessionStorage::class);
70+
->setFactory([
71+
'session' => Nette\Bridges\SecurityHttp\SessionStorage::class,
72+
'cookie' => Nette\Bridges\SecurityHttp\CookieStorage::class,
73+
][$auth->storage]);
74+
75+
if ($auth->storage === 'cookie') {
76+
if ($auth->cookieDomain === 'domain') {
77+
$auth->cookieDomain = $builder::literal('$this->getByType(Nette\Http\IRequest::class)->getUrl()->getDomain(2)');
78+
}
79+
$storage->addSetup('setCookieParameters', [$auth->cookieName, $auth->cookieDomain, $auth->cookieSamesite]);
80+
}
6381

6482
$builder->addDefinition($this->prefix('legacyUserStorage')) // deprecated
6583
->setType(Nette\Security\IUserStorage::class)
@@ -68,6 +86,10 @@ public function loadConfiguration()
6886
$user = $builder->addDefinition($this->prefix('user'))
6987
->setFactory(Nette\Security\User::class);
7088

89+
if ($auth->expiration) {
90+
$user->addSetup('setExpiration', [$auth->expiration]);
91+
}
92+
7193
if ($config->users) {
7294
$usersList = $usersRoles = $usersData = [];
7395
foreach ($config->users as $username => $data) {

tests/Security.DI/SecurityExtension.cookieStorage.phpt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ require __DIR__ . '/../bootstrap.php';
1717

1818

1919
$compiler = new DI\Compiler;
20-
$compiler->addExtension('foo', new HttpExtension);
20+
$compiler->addExtension('http', new HttpExtension);
2121
$compiler->addExtension('session', new SessionExtension);
2222
$compiler->addExtension('security', new SecurityExtension);
2323

@@ -28,16 +28,23 @@ security:
2828
storage: cookie
2929
expiration: 1 week
3030
cookieName: abc
31-
cookieDomain: xyz
31+
cookieDomain: domain
3232
cookieSamesite: Strict
33+
34+
services:
35+
http.request: Nette\Http\Request(Nette\Http\UrlScript("http://www.nette.org"))
3336
', 'neon'));
3437

3538
eval($compiler->addConfig($config)->compile());
3639
$container = new Container;
3740

3841
$storage = $container->getService('security.userStorage');
42+
$user = $container->getService('security.user');
3943
Assert::type(Nette\Bridges\SecurityHttp\CookieStorage::class, $storage);
4044

4145
Assert::with($storage, function () {
4246
Assert::same('1 week', $this->cookieExpiration);
47+
Assert::same('abc', $this->cookieName);
48+
Assert::same('nette.org', $this->cookieDomain);
49+
Assert::same('Strict', $this->cookieSameSite);
4350
});

tests/Security.DI/SecurityExtension.sessionStorage.phpt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,6 @@ security:
3131
eval($compiler->addConfig($config)->compile());
3232
$container = new Container;
3333

34-
Assert::type(Nette\Bridges\SecurityHttp\SessionStorage::class, $container->getService('security.userStorage'));
34+
$storage = $container->getService('security.userStorage');
35+
$user = $container->getService('security.user');
36+
Assert::type(Nette\Bridges\SecurityHttp\SessionStorage::class, $storage);

0 commit comments

Comments
 (0)