diff --git a/Classes/Controller/AuthenticationController.php b/Classes/Controller/AuthenticationController.php
index 45fb305..3119c9d 100644
--- a/Classes/Controller/AuthenticationController.php
+++ b/Classes/Controller/AuthenticationController.php
@@ -18,14 +18,18 @@
use Neos\Flow\I18n\Translator;
use Neos\Flow\Mvc\ActionRequest;
use Neos\Flow\Mvc\Exception\UnsupportedRequestTypeException;
+use Neos\Flow\Mvc\FlashMessage\FlashMessageService;
+use Neos\Flow\Mvc\View\ViewInterface;
use Neos\Flow\Security\Authentication\Controller\AbstractAuthenticationController;
use Neos\Flow\Security\Exception\AuthenticationRequiredException;
+use Neos\Fusion\View\FusionView;
/**
* Controller for displaying a login/logout form and authenticating/logging out "frontend users"
*/
class AuthenticationController extends AbstractAuthenticationController
{
+
/**
* @var Translator
* @Flow\Inject
@@ -45,12 +49,10 @@ class AuthenticationController extends AbstractAuthenticationController
protected $translationSourceName;
/**
- * @return void
+ * @Flow\Inject
+ * @var FlashMessageService
*/
- public function indexAction(): void
- {
- $this->view->assign('account', $this->securityContext->getAccount());
- }
+ protected $flashMessageService;
/**
* return void
@@ -60,12 +62,7 @@ public function logoutAction()
parent::logoutAction();
$uri = $this->request->getInternalArgument('__redirectAfterLogoutUri');
-
- if (empty($uri)) {
- $this->redirect('index');
- } else {
- $this->redirectToUri($uri);
- }
+ $this->redirectToUri($uri);
}
/**
@@ -76,36 +73,36 @@ public function logoutAction()
protected function onAuthenticationSuccess(ActionRequest $originalRequest = null)
{
$uri = $this->request->getInternalArgument('__redirectAfterLoginUri');
-
- if (empty($uri)) {
- $this->redirect('index');
- } else {
- $this->redirectToUri($uri);
- }
+ $this->redirectToUri($uri);
}
/**
- * Create translated FlashMessage and add it to flashMessageContainer
+ * Create add a validation error and send the request back to the referrer
*
* @param AuthenticationRequiredException $exception
* @return void
*/
protected function onAuthenticationFailure(AuthenticationRequiredException $exception = null)
{
- $title = $this->getTranslationById('authentication.failure.title');
- $message = $this->getTranslationById('authentication.failure.message');
- $this->addFlashMessage($message, $title, Error\Message::SEVERITY_ERROR, [], $exception === null ? 1496914553 : $exception->getCode());
- }
+ $referringRequest = $this->request->getReferringRequest();
+ if ($referringRequest === null) {
+ return;
+ }
- /**
- * Get translation by label id for configured source name and package key
- *
- * @param string $labelId Key to use for finding translation
- * @return string Translated message or NULL on failure
- */
- protected function getTranslationById($labelId): string
- {
- return $this->translator->translateById($labelId, [], null, null, $this->translationSourceName, $this->translationPackageKey);
+ $validationResults = new Error\Result();
+ $validationResults->addError(new Error\Error('authenticationFailure'));
+
+ $packageKey = $referringRequest->getControllerPackageKey();
+ $subpackageKey = $referringRequest->getControllerSubpackageKey();
+ if ($subpackageKey !== null) {
+ $packageKey .= '\\' . $subpackageKey;
+ }
+
+ $argumentsForNextController = $referringRequest->getArguments();
+ $argumentsForNextController['__submittedArguments'] = [];
+ $argumentsForNextController['__submittedArgumentValidationResults'] = $validationResults;
+
+ $this->forward($referringRequest->getControllerActionName(), $referringRequest->getControllerName(), $packageKey , $argumentsForNextController);
}
/**
diff --git a/Configuration/Routes.yaml b/Configuration/Routes.yaml
new file mode 100644
index 0000000..78f8447
--- /dev/null
+++ b/Configuration/Routes.yaml
@@ -0,0 +1,21 @@
+
+
+-
+ name: 'Frontend Authenticate'
+ uriPattern: 'frontend/login(.{@format})'
+ defaults:
+ '@package': 'Flowpack.Neos.FrontendLogin'
+ '@controller': 'Authentication'
+ '@action': 'authenticate'
+ '@format': 'html'
+ httpMethods: ['POST']
+
+-
+ name: 'Frontend Logout'
+ uriPattern: 'frontend/logout(.{@format})'
+ defaults:
+ '@package': 'Flowpack.Neos.FrontendLogin'
+ '@controller': 'Authentication'
+ '@action': 'logout'
+ '@format': 'html'
+ httpMethods: ['POST']
diff --git a/Configuration/Settings.yaml b/Configuration/Settings.yaml
index 10c126c..5238cc3 100644
--- a/Configuration/Settings.yaml
+++ b/Configuration/Settings.yaml
@@ -14,6 +14,10 @@ Neos:
pattern: Flowpack\Neos\FrontendLogin\Security\NeosRequestPattern
patternOptions:
matchFrontend: true
+ mvc:
+ routes:
+ Flowpack.Neos.FrontendLogin:
+ position: 'before Neos.Neos'
Neos:
userInterface:
translation:
diff --git a/Resources/Private/Fusion/NodeTypes/LoginForm.fusion b/Resources/Private/Fusion/NodeTypes/LoginForm.fusion
index 8932f06..d4f1aa9 100644
--- a/Resources/Private/Fusion/NodeTypes/LoginForm.fusion
+++ b/Resources/Private/Fusion/NodeTypes/LoginForm.fusion
@@ -1,16 +1,125 @@
##
-# "LoginForm" element, extending "Plugin"
+# "LoginForm" element, extending "ContentComponent"
#
-prototype(Flowpack.Neos.FrontendLogin:LoginForm) < prototype(Neos.Neos:Plugin) {
- package = 'Flowpack.Neos.FrontendLogin'
- controller = 'Authentication'
- action = 'index'
-
- redirectAfterLoginUri = Neos.Neos:NodeUri {
- node = ${q(node).property('redirectAfterLogin')}
- }
-
- redirectAfterLogoutUri = Neos.Neos:NodeUri {
- node = ${q(node).property('redirectAfterLogout')}
- }
-}
\ No newline at end of file
+prototype(Flowpack.Neos.FrontendLogin:LoginForm) < prototype(Neos.Neos:ContentComponent) {
+
+ loginPrototype = 'Flowpack.Neos.FrontendLogin:LoginForm.Login'
+ logoutPrototype = 'Flowpack.Neos.FrontendLogin:LoginForm.Logout'
+
+ renderer = Neos.Fusion:Case {
+ loggedIn {
+ condition = ${Security.hasRole('Flowpack.Neos.FrontendLogin:User')}
+ type = ${props.logoutPrototype}
+ element {
+ accountIdentifier = ${Security.getAccount().accountIdentifier}
+ redirectAfterLogoutUri = Neos.Neos:NodeUri {
+ node = ${q(node).property('redirectAfterLogout')}
+ }
+ }
+ }
+
+ default {
+ condition = true
+ type = ${props.loginPrototype}
+ element {
+ redirectAfterLoginUri = Neos.Neos:NodeUri {
+ node = ${q(node).property('redirectAfterLogin')}
+ }
+ }
+ }
+ }
+
+ @cache {
+ mode = 'dynamic'
+ entryIdentifier {
+ node = ${node}
+ }
+ entryDiscriminator = ${(Security.hasRole('Flowpack.Neos.FrontendLogin:User') || request.internalArguments.__submittedArgumentValidationResults.errors) ? false : 'no-fe-user'}
+ context {
+ 1 = 'node'
+ 2 = 'documentNode'
+ }
+ entryTags {
+ 1 = ${Neos.Caching.nodeTag(node)}
+ }
+ }
+}
+
+prototype(Flowpack.Neos.FrontendLogin:LoginForm.Login) < prototype(Neos.Fusion:Component) {
+
+ redirectAfterLoginUri = null
+
+ settings = ${Configuration.setting('Flowpack.Neos.FrontendLogin')}
+
+ renderer = afx`
+
+ {I18n.id('authentication.failure.title').package(props.settings.translation.packageKey).source(props.settings.translation.sourceName).translate()}
+
+ {I18n.id('authentication.failure.message').package(props.settings.translation.packageKey).source(props.settings.translation.sourceName).translate()}
+
+ {I18n.id('authentication.form.loggedIn').value('You are logged in as').package(props.settings.translation.packageKey).source(props.settings.translation.sourceName).translate()} + {props.accountIdentifier} +
+You're logged in as "{account.accountIdentifier}"
-