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.submit').package(props.settings.translation.packageKey).source(props.settings.translation.sourceName).translate()} + +
+
+ ` +} + +prototype(Flowpack.Neos.FrontendLogin:LoginForm.Logout) < prototype(Neos.Fusion:Component) { + + redirectAfterLogoutUri = null + accountIdentifier = null + + settings = ${Configuration.setting('Flowpack.Neos.FrontendLogin')} + + renderer = afx` +

+ {I18n.id('authentication.form.loggedIn').value('You are logged in as').package(props.settings.translation.packageKey).source(props.settings.translation.sourceName).translate()}  + {props.accountIdentifier} +

+ + + + + {I18n.id('authentication.form.logout').value('Logout').package(props.settings.translation.packageKey).source(props.settings.translation.sourceName).translate()} + + + ` +} diff --git a/Resources/Private/Templates/Authentication/Index.html b/Resources/Private/Templates/Authentication/Index.html deleted file mode 100644 index 76c373d..0000000 --- a/Resources/Private/Templates/Authentication/Index.html +++ /dev/null @@ -1,39 +0,0 @@ -{namespace neos=Neos\Neos\ViewHelpers} -
-
- - -

-
- - - -

You're logged in as "{account.accountIdentifier}"

- - - -
- - - - -
- - -
-
- - -
-
-
- -
-
-
-
-
-
-
-
-
diff --git a/composer.json b/composer.json index 7d7b2d4..7f04455 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,9 @@ "description": "Neos plugin demonstrating a simple frontend login", "license": "MIT", "require": { - "neos/neos": "^5.0 || dev-master" + "neos/neos": "^5.0 || dev-master", + "neos/fusion-form": "^1.0 || dev-master", + "neos/fusion-afx": "^1.4 || dev-master" }, "autoload": { "psr-4": { @@ -13,7 +15,7 @@ }, "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-master": "5.0.x-dev" }, "applied-flow-migrations": [ "TYPO3.FLOW3-201201261636",