{"id":1154,"date":"2022-02-09T16:40:40","date_gmt":"2022-02-09T15:40:40","guid":{"rendered":"https:\/\/wiki.ad-libitum.info\/?page_id=1154"},"modified":"2022-02-18T10:57:19","modified_gmt":"2022-02-18T09:57:19","slug":"authentication","status":"publish","type":"page","link":"https:\/\/wiki.ad-libitum.info\/?page_id=1154","title":{"rendered":"Authentication"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Basis ist in jedem Fall <code>composer require security-bundle<\/code>. Damit wird die <code>config\\packages\\security.yaml<\/code> erstellt. Diese steuert das System.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als n\u00e4chstes muss dann eine Userklasse erstellt werden: <code>php bin\/console make:user<\/code>. Hier muss unter anderem entschieden werden, ob eine Datenbank f\u00fcr die Userdaten ben\u00f6tigt wird oder nicht. Bei einer Anmeldung via API wird wohl keine Datenbank ben\u00f6tigt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als n\u00e4chstes brauchen wir ein Formular f\u00fcr den Login: <code>symfony console make:auth<\/code> mit der Option 1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn auth installiert ist, wird nach dem Ausf\u00fcllen des Formulars nicht wieder der aufrufende Controller gestartet. Statt dessen wird der Authenticator aufgerufen. Welcher das ist, steht in der <code>security.yaml<\/code> im Abschnitt <code>firewalls<\/code> unter <code>main<\/code>. Der dort genannte <code>provider<\/code> bezieht sich auf das, was unter <code>security:provider<\/code> aufgef\u00fchrt ist. Unter <code>firewalls:main:cusstom_authenticator<\/code> steht, welche Klasse die Authentifizierung \u00fcbernimmt. Die wurde zuvor bei <code>make:auth<\/code> angegeben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Inhalte der einzelnen Dateien als Beispiele.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"src-security-appcustomauthenticator-php\"><code>src\/Security\/AppCustomAuthenticator.php<\/code><\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">public function authenticate(Request $request): Passport\n{\n    $username = $request->request->get('username', '');\n    $password = $request->request->get('password', null);\n\n    $request->getSession()->set(Security::<em>LAST_USERNAME<\/em>, $username);\n\n    return new Passport(\n        new UserBadge($username),\n        new CustomCredentials(\n            function ($credentials, UserInterface $user) {\n                return $user->getRoles()&lt;>\"\";\n            },\n            $password\n        ),\n        [\n            new CsrfTokenBadge('authenticate', $request->request->get('_csrf_token')),\n        ]\n    );\n}\n\npublic function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response\n{\n    if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) {\n        return new RedirectResponse($targetPath);\n    }\n\n    \/\/ For example:\n    \/\/return new RedirectResponse($this->urlGenerator->generate('some_route'));\n    return new RedirectResponse($this->urlGenerator->generate('homepage'));\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"src-security-userprovider\"><code>src\/Security\/UserProvider<\/code><\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">public function loadUserByIdentifier($identifier): UserInterface\n{\n    \/\/ Load a User object from your data source or throw UserNotFoundException.\n    \/\/ The $identifier argument may not actually be a username:\n    \/\/ it is whatever value is being returned by the getUserIdentifier()\n    \/\/ method in your User class.\n\n    $api=new SqaApi();\n    $ergebnis = $api->login($_POST[\"username\"], $_POST[\"password\"]);\n\n    if (isset($ergebnis->token)) {\n       $user = new User();\n       $user->setUsername($ergebnis->token);\n       $user->setRoles([\"ROLE_AUTHENTICATED\"]);\n\n       return $user;\n    } else {\n       throw new UserNotFoundException(\"Fehler: $ergebnis\");\n    }\n}\n...\npublic function refreshUser(UserInterface $user): UserInterface\r\n{\r\n    if (!$user instanceof User) {\r\n        throw new UnsupportedUserException(sprintf('Invalid user class \"%s\".', get_class($user)));\r\n    }\r\n\r\n    \/\/ Return a User object after making sure its data is \"fresh\".\r\n    \/\/ Or throw a UsernameNotFoundException if the user no longer exists.\r\n    return $user;\r\n}\r<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"src-controller-securitycontroller\"><code>src\/Controller\/SecurityController<\/code><\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">public function login(AuthenticationUtils $authenticationUtils): Response<br>{<br>    \/\/ if ($this-&gt;getUser()) {<br>    \/\/     return $this-&gt;redirectToRoute('target_path');<br>    \/\/ }<br><br>    \/\/ get the login error if there is one<br>    $error = $authenticationUtils-&gt;getLastAuthenticationError();<br>    \/\/ last username entered by the user<br>    $lastUsername = $authenticationUtils-&gt;getLastUsername();<br><br>    return $this-&gt;render('security\/login.html.twig', ['last_username' =&gt; $lastUsername, 'error' =&gt; $error]);<br>}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Basis ist in jedem Fall composer require security-bundle. Damit wird die config\\packages\\security.yaml erstellt. Diese steuert das System. Als n\u00e4chstes muss dann eine Userklasse erstellt werden: php bin\/console make:user. Hier muss unter anderem entschieden werden, ob eine Datenbank f\u00fcr die Userdaten ben\u00f6tigt wird oder nicht. Bei einer Anmeldung via API wird wohl keine Datenbank ben\u00f6tigt. Als [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1154","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages\/1154","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1154"}],"version-history":[{"count":0,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages\/1154\/revisions"}],"wp:attachment":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}