Skip to content

Commit bc0089d

Browse files
committed
form login : use dynamic username field
1 parent 388df31 commit bc0089d

File tree

22 files changed

+340
-397
lines changed

22 files changed

+340
-397
lines changed

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
"symfony/dependency-injection": "^3.4|^4.0",
2121
"symfony/filesystem": "^3.4|^4.0",
2222
"symfony/finder": "^3.4|^4.0",
23-
"symfony/form": "^4.1",
23+
"symfony/form": "^3.4|^4.1",
2424
"symfony/framework-bundle": "^3.4|^4.0",
2525
"symfony/http-kernel": "^3.4|^4.0",
26-
"symfony/security": "^4.1"
26+
"symfony/security": "^3.4|^4.1"
2727
},
2828
"require-dev": {
2929
"allocine/twigcs": "^3.0",

src/Doctrine/DoctrineHelper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,6 @@ public function isClassAMappedEntity(string $className): bool
184184
return false;
185185
}
186186

187-
return (bool) $this->getMetadata(trim($className, '\\'));
187+
return (bool) $this->getMetadata($className);
188188
}
189189
}

src/Maker/MakeAuthenticator.php

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,7 @@ function ($answer) {
122122
Validator::notBlank($answer);
123123

124124
return Validator::classDoesNotExist(
125-
$this->generator->createClassNameDetails(
126-
$answer,
127-
'Security\\'
128-
)->getFullName()
125+
$this->generator->createClassNameDetails($answer, 'Security\\', 'Authenticator')->getFullName()
129126
);
130127
}
131128
);
@@ -152,9 +149,17 @@ function ($answer) {
152149
)
153150
);
154151

155-
$command->addArgument('user-class', InputArgument::OPTIONAL);
156-
$userClass = $interactiveSecurityHelper->guessUserClass($io, $securityData['security']['providers']);
157-
$input->setArgument('user-class', $userClass);
152+
$command->addArgument('user-class', InputArgument::REQUIRED);
153+
$input->setArgument(
154+
'user-class',
155+
$userClass = $interactiveSecurityHelper->guessUserClass($io, $securityData['security']['providers'])
156+
);
157+
158+
$command->addArgument('username-field', InputArgument::REQUIRED);
159+
$input->setArgument(
160+
'username-field',
161+
$interactiveSecurityHelper->guessUserNameField($io, $userClass, $securityData['security']['providers'])
162+
);
158163
}
159164
}
160165

@@ -219,27 +224,22 @@ private function generateAuthenticatorClass(InputInterface $input)
219224
}
220225
}
221226

222-
if ($this->doctrineHelper->isClassAMappedEntity($input->getArgument('user-class'))) {
223-
$userClassNameDetails = $this->generator->createClassNameDetails(
224-
'\\'.$input->getArgument('user-class'),
225-
'Entity\\'
226-
);
227+
$userClassNameDetails = $this->generator->createClassNameDetails(
228+
'\\'.$input->getArgument('user-class'),
229+
'Entity\\'
230+
);
227231

228-
$this->generator->generateClass(
229-
$input->getArgument('authenticator-class'),
230-
$userNeedsEncoder ? 'authenticator/LoginFormEntityAuthenticator.tpl.php' : 'authenticator/LoginFormEntityAuthenticatorNoEncoder.tpl.php',
231-
[
232-
'user_fully_qualified_class_name' => trim($userClassNameDetails->getFullName(), '\\'),
233-
'user_class_name' => $userClassNameDetails->getShortName(),
234-
]
235-
);
236-
} else {
237-
$this->generator->generateClass(
238-
$input->getArgument('authenticator-class'),
239-
$userNeedsEncoder ? 'authenticator/LoginFormNotEntityAuthenticator.tpl.php' : 'authenticator/LoginFormNotEntityAuthenticatorNoEncoder.tpl.php',
240-
[]
241-
);
242-
}
232+
$this->generator->generateClass(
233+
$input->getArgument('authenticator-class'),
234+
'authenticator/LoginFormAuthenticator.tpl.php',
235+
[
236+
'user_fully_qualified_class_name' => trim($userClassNameDetails->getFullName(), '\\'),
237+
'user_class_name' => $userClassNameDetails->getShortName(),
238+
'username_field' => $input->getArgument('username-field'),
239+
'user_needs_encoder' => $userNeedsEncoder,
240+
'user_is_entity' => $this->doctrineHelper->isClassAMappedEntity($input->getArgument('user-class'))
241+
]
242+
);
243243
}
244244
}
245245

@@ -282,7 +282,7 @@ private function generateFormLoginFiles(InputInterface $input)
282282
'templates/security/login.html.twig',
283283
'authenticator/login_form.tpl.php',
284284
[
285-
'controller_path' => $controllerPath,
285+
'username_field' => $input->getArgument('username-field')
286286
]
287287
);
288288
}

src/Resources/skeleton/authenticator/LoginFormNotEntityAuthenticator.tpl.php renamed to src/Resources/skeleton/authenticator/LoginFormAuthenticator.tpl.php

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
namespace <?= $namespace ?>;
44

5+
<?= $user_is_entity ? "use $user_fully_qualified_class_name;\n" : null ?>
6+
<?= $user_is_entity ? "use Doctrine\\ORM\\EntityManagerInterface;\n" : null ?>
57
use Symfony\Component\HttpFoundation\RedirectResponse;
68
use Symfony\Component\HttpFoundation\Request;
79
use Symfony\Component\Routing\RouterInterface;
810
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
9-
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
11+
<?= $user_needs_encoder ? "use Symfony\\Component\\Security\\Core\\Encoder\\UserPasswordEncoderInterface;\n" : null ?>
1012
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
1113
use Symfony\Component\Security\Core\Security;
1214
use Symfony\Component\Security\Core\User\UserInterface;
@@ -20,15 +22,17 @@ class <?= $class_name; ?> extends AbstractFormLoginAuthenticator
2022
{
2123
use TargetPathTrait;
2224

25+
<?= $user_is_entity ? " private \$entityManager;\n" : null ?>
2326
private $router;
2427
private $csrfTokenManager;
25-
private $passwordEncoder;
28+
<?= $user_needs_encoder ? " private \$passwordEncoder;\n" : null ?>
2629

27-
public function __construct(RouterInterface $router, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder)
30+
public function __construct(<?= $user_is_entity ? 'EntityManagerInterface $entityManager, ' : null ?>RouterInterface $router, CsrfTokenManagerInterface $csrfTokenManager<?= $user_needs_encoder ? ', UserPasswordEncoderInterface $passwordEncoder' : null ?>)
2831
{
32+
<?= $user_is_entity ? " \$this->entityManager = \$entityManager;\n" : null ?>
2933
$this->router = $router;
3034
$this->csrfTokenManager = $csrfTokenManager;
31-
$this->passwordEncoder = $passwordEncoder;
35+
<?= $user_needs_encoder ? " \$this->passwordEncoder = \$passwordEncoder;\n" : null ?>
3236
}
3337

3438
public function supports(Request $request)
@@ -40,13 +44,13 @@ public function supports(Request $request)
4044
public function getCredentials(Request $request)
4145
{
4246
$credentials = [
43-
'email' => $request->request->get('email'),
47+
'<?= $username_field ?>' => $request->request->get('<?= $username_field ?>'),
4448
'password' => $request->request->get('password'),
4549
'csrf_token' => $request->request->get('_csrf_token'),
4650
];
4751
$request->getSession()->set(
4852
Security::LAST_USERNAME,
49-
$credentials['email']
53+
$credentials['<?= $username_field ?>']
5054
);
5155

5256
return $credentials;
@@ -59,14 +63,15 @@ public function getUser($credentials, UserProviderInterface $userProvider)
5963
throw new InvalidCsrfTokenException();
6064
}
6165

62-
// Load / create our user however you need.
66+
<?= $user_is_entity ? "return \$this->entityManager->getRepository($user_class_name::class)->findOneBy(['$username_field' => \$credentials['$username_field']]);\n"
67+
: "// Load / create our user however you need.
6368
// You can do this by calling the user provider, or with custom logic here.
64-
return $userProvider->loadUserByUsername($credentials['email']);
69+
return \$userProvider->loadUserByUsername(\$credentials['$username_field']);\n"; ?>
6570
}
6671

6772
public function checkCredentials($credentials, UserInterface $user)
6873
{
69-
return $this->passwordEncoder->isPasswordValid($user, $credentials['password']);
74+
<?= $user_needs_encoder ? "return \$this->passwordEncoder->isPasswordValid(\$user, \$credentials['password']);\n" : "return true;\n" ?>
7075
}
7176

7277
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)

src/Resources/skeleton/authenticator/LoginFormEntityAuthenticator.tpl.php

Lines changed: 0 additions & 87 deletions
This file was deleted.

src/Resources/skeleton/authenticator/LoginFormEntityAuthenticatorNoEncoder.tpl.php

Lines changed: 0 additions & 84 deletions
This file was deleted.

0 commit comments

Comments
 (0)