]> git.mxchange.org Git - addressbook-war.git/commitdiff
Continued:
authorRoland Haeder <roland@mxchange.org>
Tue, 6 Oct 2015 10:11:50 +0000 (12:11 +0200)
committerRoland Haeder <roland@mxchange.org>
Tue, 6 Oct 2015 10:11:50 +0000 (12:11 +0200)
- added new beans (controller) for registration and login
- added security constrain (maybe working?) for login area. Maybe this has to be done manually as the user table is very specific.
- add dummy login error page
- updated jars
Signed-off-by:Roland Häder <roland@mxchange.org>

21 files changed:
lib/jcontacts-business-core.jar
lib/jcontacts-core.jar
lib/jcontacts-lib.jar
lib/jcore.jar
lib/jcoreee.jar
lib/juser-core.jar
lib/juser-lib.jar
nbproject/build-impl.xml
nbproject/genfiles.properties
nbproject/project.properties
nbproject/project.xml
src/java/org/mxchange/addressbook/beans/login/UserLoginWebBean.java [new file with mode: 0644]
src/java/org/mxchange/addressbook/beans/login/UserLoginWebController.java [new file with mode: 0644]
src/java/org/mxchange/addressbook/beans/register/UserRegisterWebBean.java [new file with mode: 0644]
src/java/org/mxchange/addressbook/beans/register/UserRegisterWebController.java [new file with mode: 0644]
src/java/org/mxchange/addressbook/beans/user/UserWebBean.java
src/java/org/mxchange/addressbook/beans/user/UserWebController.java
web/WEB-INF/templates/guest/guest_login_form.tpl
web/WEB-INF/web.xml
web/user/login.xhtml
web/user/login_error.xhtml [new file with mode: 0644]

index 7e2bfd3a2d9f2817b575ecf5254b2f74ad977b2b..a45d168c0d1a99c420451975ef7957053754be10 100644 (file)
Binary files a/lib/jcontacts-business-core.jar and b/lib/jcontacts-business-core.jar differ
index 60d3cc88e52b6a8bfa6ca7b45f787c3a8290892e..116c3511fbfe8d060114a5877f2f106b1b8c157b 100644 (file)
Binary files a/lib/jcontacts-core.jar and b/lib/jcontacts-core.jar differ
index 7797a5a531de5079d6a9e194c977078fb4408e03..99666abdeae3b6a9a46f8038da148273677da22c 100644 (file)
Binary files a/lib/jcontacts-lib.jar and b/lib/jcontacts-lib.jar differ
index 2c6f30efe9f8c246eae16a87aef835bb909ba01d..b506a165e930439400060fff313b735ea2ad09f3 100644 (file)
Binary files a/lib/jcore.jar and b/lib/jcore.jar differ
index 19ec1c4c0c5355690db3b56b7a5d61624e477181..d87f56db099dbce4c0917c934638141e43c7b492 100644 (file)
Binary files a/lib/jcoreee.jar and b/lib/jcoreee.jar differ
index 1651c24ee4b8986a7d54e6c7087867c359745bfe..30c2eb8281ea781cce326a635f5476b122507439 100644 (file)
Binary files a/lib/juser-core.jar and b/lib/juser-core.jar differ
index e6541325d05fda6d2b60c9d38d19cc988b12e4d6..60198aa1bf4e0a81b720f797d1f8d38792967c61 100644 (file)
Binary files a/lib/juser-lib.jar and b/lib/juser-lib.jar differ
index f151f5a3d17d76a7c36ff033b7cdab59eb663196..695ae3639746dc32d8bd56c9683edec375f7760a 100644 (file)
@@ -881,11 +881,17 @@ exists or setup the property manually. For example like this:
         <ant antfile="${project.addressbook-lib}/build.xml" inheritall="false" target="jar">
             <property name="deploy.on.save" value="false"/>
         </ant>
+        <ant antfile="${project.juser-lib}/build.xml" inheritall="false" target="jar">
+            <property name="deploy.on.save" value="false"/>
+        </ant>
     </target>
     <target depends="init" if="dist.ear.dir" name="deps-ear-jar" unless="no.deps">
         <ant antfile="${project.addressbook-lib}/build.xml" inheritall="false" target="jar">
             <property name="deploy.on.save" value="false"/>
         </ant>
+        <ant antfile="${project.juser-lib}/build.xml" inheritall="false" target="jar">
+            <property name="deploy.on.save" value="false"/>
+        </ant>
     </target>
     <target depends="init, deps-module-jar, deps-ear-jar" name="deps-jar" unless="no.deps"/>
     <target depends="init,deps-jar" name="-pre-pre-compile">
@@ -1041,6 +1047,7 @@ exists or setup the property manually. For example like this:
         <copyfiles files="${reference.addressbook-lib.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
         <copyfiles files="${file.reference.cdi-api.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
         <copyfiles files="${file.reference.gf-client.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
+        <copyfiles files="${reference.juser-lib.jar}" iftldtodir="${build.web.dir}/WEB-INF" todir="${dist.ear.dir}/lib"/>
         <mkdir dir="${build.web.dir}/META-INF"/>
         <manifest file="${build.web.dir}/META-INF/MANIFEST.MF" mode="update"/>
     </target>
@@ -1056,6 +1063,7 @@ exists or setup the property manually. For example like this:
         <copyfiles files="${reference.addressbook-lib.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
         <copyfiles files="${file.reference.cdi-api.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
         <copyfiles files="${file.reference.gf-client.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
+        <copyfiles files="${reference.juser-lib.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
     </target>
     <target depends="init" if="dist.ear.dir" name="-clean-webinf-lib">
         <delete dir="${build.web.dir}/WEB-INF/lib"/>
@@ -1470,6 +1478,7 @@ exists or setup the property manually. For example like this:
             -->
     <target depends="init" name="deps-clean" unless="no.deps">
         <ant antfile="${project.addressbook-lib}/build.xml" inheritall="false" target="clean"/>
+        <ant antfile="${project.juser-lib}/build.xml" inheritall="false" target="clean"/>
     </target>
     <target depends="init" name="do-clean">
         <condition property="build.dir.to.clean" value="${build.web.dir}">
index 8245c23834d8476722ad1d12088c7d46a2f58a80..87bf09460b118a77d1cd69b846405f445e8fe472 100644 (file)
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=d8bc4ea8
+build.xml.data.CRC32=f85eb01a
 build.xml.script.CRC32=be5f34f7
 build.xml.stylesheet.CRC32=651128d4@1.68.1.1
 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
 # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=d8bc4ea8
-nbproject/build-impl.xml.script.CRC32=855e3438
+nbproject/build-impl.xml.data.CRC32=f85eb01a
+nbproject/build-impl.xml.script.CRC32=045dff2a
 nbproject/build-impl.xml.stylesheet.CRC32=99ea4b56@1.68.1.1
index ced13a96efa3d9848d23665bf1d593ca35b4da47..2f55c202d783889cc17095c5dd95d35c93c0b4ca 100644 (file)
@@ -69,7 +69,8 @@ javac.classpath=\
     ${file.reference.juser-lib.jar}:\
     ${reference.addressbook-lib.jar}:\
     ${file.reference.cdi-api.jar}:\
-    ${file.reference.gf-client.jar}
+    ${file.reference.gf-client.jar}:\
+    ${reference.juser-lib.jar}
 # Space-separated list of extra javac options
 javac.compilerargs=-Xlint:unchecked -Xlint:deprecation
 javac.debug=true
@@ -99,8 +100,10 @@ lib.dir=${web.docbase.dir}/WEB-INF/lib
 persistence.xml.dir=${conf.dir}
 platform.active=default_platform
 project.addressbook-lib=../addressbook-lib
+project.juser-lib=../juser-lib
 project.license=gpl30
 reference.addressbook-lib.jar=${project.addressbook-lib}/dist/addressbook-lib.jar
+reference.juser-lib.jar=${project.juser-lib}/dist/juser-lib.jar
 resource.dir=setup
 run.test.classpath=\
     ${javac.test.classpath}:\
index 8a21668fe9e4dad17a53b2308fda225e50390404..b80d72346152351651f91f5de7111bd49c119fb4 100644 (file)
                     <file>${file.reference.gf-client.jar}</file>
                     <path-in-war>WEB-INF/lib</path-in-war>
                 </library>
+                <library dirs="200">
+                    <file>${reference.juser-lib.jar}</file>
+                    <path-in-war>WEB-INF/lib</path-in-war>
+                </library>
             </web-module-libraries>
             <web-module-additional-libraries/>
             <source-roots>
                 <clean-target>clean</clean-target>
                 <id>jar</id>
             </reference>
+            <reference>
+                <foreign-project>juser-lib</foreign-project>
+                <artifact-type>jar</artifact-type>
+                <script>build.xml</script>
+                <target>jar</target>
+                <clean-target>clean</clean-target>
+                <id>jar</id>
+            </reference>
         </references>
     </configuration>
 </project>
diff --git a/src/java/org/mxchange/addressbook/beans/login/UserLoginWebBean.java b/src/java/org/mxchange/addressbook/beans/login/UserLoginWebBean.java
new file mode 100644 (file)
index 0000000..9627027
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.beans.login;
+
+import javax.enterprise.context.SessionScoped;
+import javax.faces.view.facelets.FaceletException;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import org.mxchange.addressbook.beans.user.UserWebController;
+import org.mxchange.jusercore.exceptions.UserNotFoundException;
+import org.mxchange.jusercore.exceptions.UserStatusLockedException;
+import org.mxchange.jusercore.exceptions.UserStatusUnconfirmedException;
+import org.mxchange.jusercore.model.login.UserLoginSessionBeanRemote;
+import org.mxchange.jusercore.model.user.User;
+
+/**
+ * A web bean for user registration
+ * <p>
+ * @author Roland Haeder
+ */
+@Named ("loginController")
+@SessionScoped
+public class UserLoginWebBean implements UserLoginWebController {
+
+       /**
+        * Reemote register session bean
+        */
+       private UserLoginSessionBeanRemote login;
+
+       /**
+        * User controller
+        */
+       @Inject
+       private UserWebController userController;
+
+       /**
+        * Serial number
+        */
+       private static final long serialVersionUID = 47_828_986_719_691_592L;
+
+       /**
+        * Default constructor
+        */
+       public UserLoginWebBean () {
+               try {
+                       // Get initial context
+                       Context context = new InitialContext();
+
+                       // Try to lookup
+                       this.login = (UserLoginSessionBeanRemote) context.lookup("ejb/stateless-login"); //NOI18N
+               } catch (final NamingException ex) {
+                       // Continue to throw
+                       throw new FaceletException(ex);
+               }
+       }
+
+       @Override
+       public void doLogin () {
+               // Get user instance
+               User user = this.userController.createUserInstance();
+
+               try {
+                       // Call bean
+                       this.login.loginUser(user);
+               } catch (final UserNotFoundException | UserStatusLockedException | UserStatusUnconfirmedException ex) {
+                       // Throw again
+                       throw new FaceletException(ex);
+               }
+       }
+}
diff --git a/src/java/org/mxchange/addressbook/beans/login/UserLoginWebController.java b/src/java/org/mxchange/addressbook/beans/login/UserLoginWebController.java
new file mode 100644 (file)
index 0000000..81d90ba
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.beans.login;
+
+import java.io.Serializable;
+
+/**
+ * An interface for registration web controllers
+ * <p>
+ * @author Roland Haeder
+ */
+public interface UserLoginWebController extends Serializable {
+
+       /**
+        * Logins the user, if the account is found, confirmed and unlocked.
+        */
+       public void doLogin ();
+}
diff --git a/src/java/org/mxchange/addressbook/beans/register/UserRegisterWebBean.java b/src/java/org/mxchange/addressbook/beans/register/UserRegisterWebBean.java
new file mode 100644 (file)
index 0000000..5c7b266
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.beans.register;
+
+import javax.enterprise.context.SessionScoped;
+import javax.faces.view.facelets.FaceletException;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import org.mxchange.addressbook.beans.user.UserWebController;
+import org.mxchange.jusercore.exceptions.UserAlreadyRegisteredException;
+import org.mxchange.jusercore.model.register.UserRegistrationSessionBeanRemote;
+import org.mxchange.jusercore.model.user.User;
+
+/**
+ * A web bean for user registration
+ * <p>
+ * @author Roland Haeder
+ */
+@Named ("registerController")
+@SessionScoped
+public class UserRegisterWebBean implements UserRegisterWebController {
+
+       /**
+        * Reemote register session bean
+        */
+       private UserRegistrationSessionBeanRemote register;
+
+       /**
+        * User controller
+        */
+       @Inject
+       private UserWebController userController;
+
+       /**
+        * Serial number
+        */
+       private static final long serialVersionUID = 47_828_986_719_691_592L;
+
+       /**
+        * Default constructor
+        */
+       public UserRegisterWebBean () {
+               try {
+                       // Get initial context
+                       Context context = new InitialContext();
+
+                       // Try to lookup
+                       this.register = (UserRegistrationSessionBeanRemote) context.lookup("ejb/stateless-register"); //NOI18N
+               } catch (final NamingException ex) {
+                       // Continue to throw
+                       throw new FaceletException(ex);
+               }
+       }
+
+       @Override
+       public void doRegister () {
+               // Get user instance
+               User user = this.userController.createUserInstance();
+
+               try {
+                       // Call bean
+                       this.register.registerUser(user);
+               } catch (final UserAlreadyRegisteredException ex) {
+                       // Continue to throw
+                       throw new FaceletException(ex);
+               }
+       }
+}
diff --git a/src/java/org/mxchange/addressbook/beans/register/UserRegisterWebController.java b/src/java/org/mxchange/addressbook/beans/register/UserRegisterWebController.java
new file mode 100644 (file)
index 0000000..bd27c9b
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.beans.register;
+
+import java.io.Serializable;
+
+/**
+ * An interface for registration web controllers
+ * <p>
+ * @author Roland Haeder
+ */
+public interface UserRegisterWebController extends Serializable {
+
+       /**
+        * Registers the user, if not found. Otherwise this method should throw an
+        * exception.
+        */
+       public void doRegister ();
+}
index 9ecf3bb7fcae0f29f018f8cb9232d796856a4c90..6f72ab676d5a6d681aa830713d7c0fdba65116bb 100644 (file)
@@ -119,6 +119,11 @@ public class UserWebBean implements UserWebController {
         */
        private String userName;
 
+       /**
+        * User password (unencrypted from web form)
+        */
+       private String userPassword;
+
        /**
         * ZIP code
         */
@@ -316,6 +321,16 @@ public class UserWebBean implements UserWebController {
                this.userName = userName;
        }
 
+       @Override
+       public String getUserPassword () {
+               return this.userPassword;
+       }
+
+       @Override
+       public void setUserPassword (final String userPassword) {
+               this.userPassword = userPassword;
+       }
+
        @Override
        public Integer getZipCode () {
                return this.zipCode;
index 085c0e649ec75115eef06729fe90f3eae062b0fc..c161b61aed3f410d1ef93aad2cc511cc33aeabb2 100644 (file)
@@ -90,6 +90,20 @@ public interface UserWebController extends Serializable {
         */
        public void setUserName (final String userName);
 
+       /**
+        * Getter for unencrypted user password
+        * <p>
+        * @return Unencrypted user password
+        */
+       public String getUserPassword ();
+
+       /**
+        * Setter for unencrypted user password
+        * <p>
+        * @param userPassword Unencrypted user password
+        */
+       public void setUserPassword (final String userPassword);
+
        /**
         * Company name
         * <p>
index 0e810499b182aa1d301a4369bd474a845fd84505..187e5e8581fc390f1a462e532aaf7c5f7bdbc03e 100644 (file)
 
                                        <div class="table_row">
                                                <div class="table_left">
-                                                       <h:outputLabel for="id" value="#{msg.ENTER_USER_NAME}" />
+                                                       <h:outputLabel for="userName" value="#{msg.ENTER_USER_NAME}" />
                                                </div>
 
                                                <div class="table_right">
-                                                       <h:inputText class="input" id="id" size="10" maxlength="20" required="true" requiredMessage="#{msg.LOGIN_NO_USER_NAME_MESSAGE}" />
+                                                       <h:inputText class="input" id="userName" value="#{userController.userName}" size="10" maxlength="20" required="true" requiredMessage="#{msg.LOGIN_NO_USER_NAME_MESSAGE}" />
                                                </div>
                                        </div>
 
 
                                        <div class="table_row">
                                                <div class="table_left">
-                                                       <h:outputLabel for="password" value="#{msg.ENTER_PASSWORD}" />
+                                                       <h:outputLabel for="userPassword" value="#{msg.ENTER_PASSWORD}" />
                                                </div>
 
                                                <div class="table_right">
-                                                       <h:inputSecret class="input" id="password" size="10" maxlength="255" required="true" requiredMessage="#{msg.LOGIN_NO_PASSWORD_MESSAGE}" />
+                                                       <h:inputSecret class="input" id="userPassword" value="#{userController.userPassword}" size="10" maxlength="255" required="true" requiredMessage="#{msg.LOGIN_NO_PASSWORD_MESSAGE}" />
                                                </div>
                                        </div>
 
@@ -41,7 +41,7 @@
 
                                <div class="table_footer">
                                        <h:commandButton class="reset" type="reset" value="#{msg.BUTTON_RESET_FORM}" />
-                                       <h:commandButton class="submit" type="submit" action="#{controller.doLogin()}" value="#{msg.BUTTON_USER_LOGIN}" />
+                                       <h:commandButton class="submit" type="submit" action="#{loginController.doLogin()}" value="#{msg.BUTTON_USER_LOGIN}" />
                                </div>
                        </div>
                </h:form>
index d256d2a33a4c7d2b4c2f17dee41d883f136b73f8..c270f5248302332f3b4b5d6128ebb4743bd87d02 100644 (file)
        <welcome-file-list>
                <welcome-file>faces/index.xhtml</welcome-file>
        </welcome-file-list>
+       <security-constraint>
+               <display-name>Constraint1</display-name>
+               <web-resource-collection>
+                       <web-resource-name>loginArea</web-resource-name>
+                       <description>Login area</description>
+                       <url-pattern>/llogin/*</url-pattern>
+               </web-resource-collection>
+               <auth-constraint>
+                       <description>User Authentication</description>
+                       <role-name>user</role-name>
+               </auth-constraint>
+       </security-constraint>
+       <login-config>
+               <auth-method>FORM</auth-method>
+               <realm-name>Loginbereich / Login area</realm-name>
+               <form-login-config>
+                       <form-login-page>/user/login.xhtml</form-login-page>
+                       <form-error-page>/user/login_error.xhtml</form-error-page>
+               </form-login-config>
+       </login-config>
+       <security-role>
+               <description>A logged-in user that has previously registered himself/herself.</description>
+               <role-name>user</role-name>
+       </security-role>
+       <mime-mapping>
+               <extension>tpl</extension>
+               <mime-type>text/plain</mime-type>
+       </mime-mapping>
 </web-app>
index fada53c00f350439b14e1bdec2cb175366a2568d..77bf49b124b3f4e200c047ec138a7089d2e2ad65 100644 (file)
@@ -21,7 +21,7 @@
                <ui:define name="content">
                        <div class="para">
                                <!-- TODO Internatialize this somehow //-->
-                               Noch kein Kunde? Einfach beim Bestellen anmelden oder <h:link id="user_register" outcome="user_register" title="Als Kunde anmelden">hier</h:link> anmelden.
+                               Noch kein Benutzerkonto? Einfach <h:link id="user_register" outcome="user_register" title="Als Benutzer anmelden">hier</h:link> anmelden.
                        </div>
 
                        <div class="para">
diff --git a/web/user/login_error.xhtml b/web/user/login_error.xhtml
new file mode 100644 (file)
index 0000000..36b34d6
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+         xmlns:ui="http://java.sun.com/jsf/facelets"
+         xmlns:h="http://xmlns.jcp.org/jsf/html"
+         xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
+         xmlns:f="http://xmlns.jcp.org/jsf/core"
+         >
+
+       <ui:composition template="/WEB-INF/templates/guest/guest_base.tpl" id="login_error">
+               <ui:define name="title">#{msg.PAGE_TITLE_USER_LOGIN_ERROR}</ui:define>
+
+               <ui:define name="menu">
+                       <ui:include id="menu" class="guest_menu" src="/WEB-INF/templates/guest/guest_menu.tpl" />
+               </ui:define>
+
+               <ui:define name="content_header">
+                       #{msg.SUB_TITLE_USER_LOGIN_ERROR}
+               </ui:define>
+
+               <ui:define name="content">
+                       Hier kommt die Fehlermeldung hin.
+               </ui:define>
+
+               <ui:define name="footer">
+                       <ui:include id="footer" class="guest_footer" src="/WEB-INF/templates/guest/guest_footer.tpl" />
+               </ui:define>
+       </ui:composition>
+</html>