Basis ist in jedem Fall composer require security-bundle. Damit wird die config\packages\security.yaml erstellt. Diese steuert das System.
Als nächstes muss dann eine Userklasse erstellt werden: php bin/console make:user. Hier muss unter anderem entschieden werden, ob eine Datenbank für die Userdaten benötigt wird oder nicht. Bei einer Anmeldung via API wird wohl keine Datenbank benötigt.
Als nächstes brauchen wir ein Formular für den Login: symfony console make:auth mit der Option 1.
Wenn auth installiert ist, wird nach dem Ausfüllen des Formulars nicht wieder der aufrufende Controller gestartet. Statt dessen wird der Authenticator aufgerufen. Welcher das ist, steht in der security.yaml im Abschnitt firewalls unter main. Der dort genannte provider bezieht sich auf das, was unter security:provider aufgeführt ist. Unter firewalls:main:cusstom_authenticator steht, welche Klasse die Authentifizierung übernimmt. Die wurde zuvor bei make:auth angegeben.
Die Inhalte der einzelnen Dateien als Beispiele.
src/Security/AppCustomAuthenticator.php
public function authenticate(Request $request): Passport
{
$username = $request->request->get('username', '');
$password = $request->request->get('password', null);
$request->getSession()->set(Security::LAST_USERNAME, $username);
return new Passport(
new UserBadge($username),
new CustomCredentials(
function ($credentials, UserInterface $user) {
return $user->getRoles()<>"";
},
$password
),
[
new CsrfTokenBadge('authenticate', $request->request->get('_csrf_token')),
]
);
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
{
if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) {
return new RedirectResponse($targetPath);
}
// For example:
//return new RedirectResponse($this->urlGenerator->generate('some_route'));
return new RedirectResponse($this->urlGenerator->generate('homepage'));
}
src/Security/UserProvider
public function loadUserByIdentifier($identifier): UserInterface
{
// Load a User object from your data source or throw UserNotFoundException.
// The $identifier argument may not actually be a username:
// it is whatever value is being returned by the getUserIdentifier()
// method in your User class.
$api=new SqaApi();
$ergebnis = $api->login($_POST["username"], $_POST["password"]);
if (isset($ergebnis->token)) {
$user = new User();
$user->setUsername($ergebnis->token);
$user->setRoles(["ROLE_AUTHENTICATED"]);
return $user;
} else {
throw new UserNotFoundException("Fehler: $ergebnis");
}
}
...
public function refreshUser(UserInterface $user): UserInterface
{
if (!$user instanceof User) {
throw new UnsupportedUserException(sprintf('Invalid user class "%s".', get_class($user)));
}
// Return a User object after making sure its data is "fresh".
// Or throw a UsernameNotFoundException if the user no longer exists.
return $user;
}
src/Controller/SecurityController
public function login(AuthenticationUtils $authenticationUtils): Response
{
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}