From fb973ab2af898c173c594974cecc103b577284d2 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Mon, 20 Jan 2020 20:51:04 +0100 Subject: [PATCH 1/4] added typehing --- src/Bridges/SecurityDI/SecurityExtension.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Bridges/SecurityDI/SecurityExtension.php b/src/Bridges/SecurityDI/SecurityExtension.php index bb485da6..8d4d4973 100644 --- a/src/Bridges/SecurityDI/SecurityExtension.php +++ b/src/Bridges/SecurityDI/SecurityExtension.php @@ -49,6 +49,7 @@ public function getConfigSchema(): Nette\Schema\Schema public function loadConfiguration() { + /** @var object{debugger: bool, users: array, roles: array, resources: array} $config */ $config = $this->config; $builder = $this->getContainerBuilder(); From 7bed8bc7e09716b7621ff13f0ef497f9a5a7cdbe Mon Sep 17 00:00:00 2001 From: MartkCz Date: Mon, 27 Jan 2020 11:07:33 +0100 Subject: [PATCH 2/4] SecurityExtensions, SimpleAuthenticator: add option for users data (#40) --- src/Bridges/SecurityDI/SecurityExtension.php | 10 +++--- src/Security/SimpleAuthenticator.php | 9 +++-- tests/Security/SimpleAuthenticator.Data.phpt | 37 ++++++++++++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 tests/Security/SimpleAuthenticator.Data.phpt diff --git a/src/Bridges/SecurityDI/SecurityExtension.php b/src/Bridges/SecurityDI/SecurityExtension.php index 8d4d4973..d87f21a7 100644 --- a/src/Bridges/SecurityDI/SecurityExtension.php +++ b/src/Bridges/SecurityDI/SecurityExtension.php @@ -35,9 +35,10 @@ public function getConfigSchema(): Nette\Schema\Schema 'users' => Expect::arrayOf( Expect::anyOf( Expect::string(), // user => password - Expect::structure([ // user => password + roles + Expect::structure([ // user => password + roles + data 'password' => Expect::string(), 'roles' => Expect::anyOf(Expect::string(), Expect::listOf('string')), + 'data' => Expect::array(), ])->castTo('array') ) ), @@ -70,17 +71,18 @@ public function loadConfiguration() } if ($config->users) { - $usersList = $usersRoles = []; + $usersList = $usersRoles = $usersData = []; foreach ($config->users as $username => $data) { $data = is_array($data) ? $data : ['password' => $data]; - $this->validateConfig(['password' => null, 'roles' => null], $data, $this->prefix("security.users.$username")); + $this->validateConfig(['password' => null, 'roles' => null, 'data' => []], $data, $this->prefix("security.users.$username")); $usersList[$username] = $data['password']; $usersRoles[$username] = $data['roles'] ?? null; + $usersData[$username] = $data['data'] ?? []; } $builder->addDefinition($this->prefix('authenticator')) ->setType(Nette\Security\IAuthenticator::class) - ->setFactory(Nette\Security\SimpleAuthenticator::class, [$usersList, $usersRoles]); + ->setFactory(Nette\Security\SimpleAuthenticator::class, [$usersList, $usersRoles, $usersData]); if ($this->name === 'security') { $builder->addAlias('nette.authenticator', $this->prefix('authenticator')); diff --git a/src/Security/SimpleAuthenticator.php b/src/Security/SimpleAuthenticator.php index b2f97325..9f0a1996 100644 --- a/src/Security/SimpleAuthenticator.php +++ b/src/Security/SimpleAuthenticator.php @@ -25,15 +25,20 @@ class SimpleAuthenticator implements IAuthenticator /** @var array */ private $usersRoles; + /** @var array */ + private $usersData; + /** * @param array $userlist list of pairs username => password * @param array $usersRoles list of pairs username => role[] + * @param array $usersData list of pairs username => mixed[] */ - public function __construct(array $userlist, array $usersRoles = []) + public function __construct(array $userlist, array $usersRoles = [], array $usersData = []) { $this->userlist = $userlist; $this->usersRoles = $usersRoles; + $this->usersData = $usersData; } @@ -48,7 +53,7 @@ public function authenticate(array $credentials): IIdentity foreach ($this->userlist as $name => $pass) { if (strcasecmp($name, $username) === 0) { if ((string) $pass === (string) $password) { - return new Identity($name, $this->usersRoles[$name] ?? null); + return new Identity($name, $this->usersRoles[$name] ?? null, $this->usersData[$name] ?? []); } else { throw new AuthenticationException('Invalid password.', self::INVALID_CREDENTIAL); } diff --git a/tests/Security/SimpleAuthenticator.Data.phpt b/tests/Security/SimpleAuthenticator.Data.phpt new file mode 100644 index 00000000..4cf1a6e5 --- /dev/null +++ b/tests/Security/SimpleAuthenticator.Data.phpt @@ -0,0 +1,37 @@ + 'john123', + 'admin' => 'admin123', + 'user' => 'user123', +]; +$usersData = [ + 'admin' => ['nick' => 'admin', 'email' => 'foo@bar.com'], + 'user' => ['nick' => 'user', 'email' => 'foo@bar.com'], +]; +$expectedData = [ + 'admin' => ['nick' => 'admin', 'email' => 'foo@bar.com'], + 'user' => ['nick' => 'user', 'email' => 'foo@bar.com'], + 'john' => [], +]; + +$authenticator = new SimpleAuthenticator($users, [], $usersData); + +foreach ($users as $username => $password) { + $identity = $authenticator->authenticate([$username, $password]); + Assert::equal($username, $identity->getId()); + Assert::equal($expectedData[$username], $identity->getData()); +} From 869308ac426ed08755e742270d5caab0de12a15d Mon Sep 17 00:00:00 2001 From: David Grudl Date: Sun, 23 Feb 2020 19:19:08 +0100 Subject: [PATCH 3/4] travis: uses PHP 7.4 for coding checks --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index b1ecaee6..3a1d7bc3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,6 +27,7 @@ jobs: - name: Nette Code Checker + php: 7.4 install: - travis_retry composer create-project nette/code-checker temp/code-checker ^3 --no-progress script: @@ -34,6 +35,7 @@ jobs: - name: Nette Coding Standard + php: 7.4 install: - travis_retry composer create-project nette/coding-standard temp/coding-standard ^2 --no-progress script: @@ -41,11 +43,13 @@ jobs: - stage: Static Analysis (informative) + php: 7.4 script: - composer run-script phpstan - stage: Code Coverage + php: 7.4 script: - vendor/bin/tester -p phpdbg tests -s --coverage ./coverage.xml --coverage-src ./src after_script: From 07d5c01221f3d8c663bab0a9e5ed5aaae08b1c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bar=C3=A1=C5=A1ek?= Date: Fri, 3 Apr 2020 17:34:07 +0200 Subject: [PATCH 4/4] UserPanel: Better design of "No identity." --- src/Bridges/SecurityTracy/templates/UserPanel.panel.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bridges/SecurityTracy/templates/UserPanel.panel.phtml b/src/Bridges/SecurityTracy/templates/UserPanel.panel.phtml index 18e3c954..17873ed4 100644 --- a/src/Bridges/SecurityTracy/templates/UserPanel.panel.phtml +++ b/src/Bridges/SecurityTracy/templates/UserPanel.panel.phtml @@ -9,5 +9,5 @@ use Tracy\Dumper;

isLoggedIn()): ?>Logged inUnlogged

- getIdentity()): echo Dumper::toHtml($user->getIdentity(), [Dumper::LIVE => true]); else: ?>

no identity

+ getIdentity()): echo Dumper::toHtml($user->getIdentity(), [Dumper::LIVE => true]); else: ?>

No identity.