Hallo,
ich bin dabei einen Controller zu schreiben, über den man sich per Token direkt ins Backend einloggen kann (User klickt auf externer Seite einen Button und wird bei mir im Backend eingeloggt).
In anderen Posts habe ich so einen Token-Login/Auto-Login für Member gefunden und versucht dies so für BackendUser umzubauen. Hier der verkürzte Code:
PHP-Code:
<?php
use Contao\BackendUser;
use Contao\UserModel;
/**
* @Route("/login/external", name=LoginExternalController::class, defaults={"_scope": "frontend"})
*/
class LoginExternalController extends AbstractController implements FrameworkAwareInterface {
use FrameworkAwareTrait;
protected $request; protected $userProvider; protected $tokenStorage; protected $router; protected $dispatcher; protected $userChecker; protected $authenticationSuccessHandler;
public function __construct(
UserProviderInterface $userProvider, //'@contao.security.backend_user_provider'
TokenStorageInterface $tokenStorage, //'@security.token_storage'
UrlGenerator $router,
EventDispatcherInterface $dispatcher, //'@event_dispatcher'
UserChecker $userChecker, //'@contao.security.user_checker'
AuthenticationSuccessHandlerInterface $authenticationSuccessHandler //'@contao.security.authentication_success_handler'
) {...}
public function __invoke(Request $request): RedirectResponse {
$this->request = $request;
$this->framework->initialize();
//Get UserData from token (username, email, name)
//Find User or create User with Group
$user = UserModel::findByUsername($token->$username);
$this->login($user->username);
return new RedirectResponse("/contao");
}
public function login($username) {
$user = $this->userProvider->loadUserByUsername($username);
$this->userChecker->checkPreAuth($user);
$usernamePasswordToken = new UsernamePasswordToken($user, null, 'backend', $user->getRoles());
$this->tokenStorage->setToken($usernamePasswordToken);
$this->dispatcher->dispatch('security.interactive_login', new InteractiveLoginEvent($this->request, $usernamePasswordToken));
$this->request->request->set('_target_path', base64_encode($this->request->getRequestUri()));
$this->authenticationSuccessHandler->onAuthenticationSuccess($this->request, $usernamePasswordToken);
}
}
Im Prinzip läuft auch alles durch, bis es zum Redirect geht, der dann einfach auf die Contao Login-Form weiterleitet. Ich habe gesehen, dass in der Datenbank bei Aufruf auch eine Session des Users in die Datenbank eingetragen wird und das LastLogin-Feld geupdated wird.
Leider hab ich gar keine Beispiele gefunden habe, wie man einen User einloggt, nur einen Member. Deshalb stellt sich natürlich zuerst die Frage ob dies überhaupt möglich ist?
Ansonsten hatte ich noch überlegt, dass es vielleicht daran liegen könnte, dass die User kein Passwort eingetragen haben.
Danke für eure Hilfe,
Viele Grüße
Stefan
Lesezeichen