annotate gwt-client/src/main/java/org/dive4elements/river/client/server/LoginServlet.java @ 5933:1b939742629e

Pass LoginServlet's ServletContext to the Authenticators. When implementing SAML validation we need a way to configure a trusted key, and passing the ServletContext seems to be about the simplest way to do this.
author Bernhard Herzog <bh@intevation.de>
date Wed, 08 May 2013 17:56:13 +0200
parents 172338b1407f
children 24dc13ac8e6c
rev   line source
5861
172338b1407f GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
172338b1407f GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
172338b1407f GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
172338b1407f GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
172338b1407f GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
172338b1407f GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
6 * documentation coming with Dive4Elements River for details.
172338b1407f GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
172338b1407f GWT client: Added copyright header.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5835
821a02bbfb4e Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5834
diff changeset
9 package org.dive4elements.river.client.server;
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
10
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
11 import java.io.IOException;
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
12
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
13 import javax.servlet.ServletException;
3485
71ba3cf3ec5e Refactor Authentication to allow to pass the Freatures to the user class
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2984
diff changeset
14 import javax.servlet.ServletContext;
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
15 import javax.servlet.http.HttpServlet;
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
16 import javax.servlet.http.HttpServletRequest;
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
17 import javax.servlet.http.HttpServletResponse;
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
18 import javax.servlet.http.HttpSession;
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
19
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
20 import org.apache.log4j.Logger;
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
21
5835
821a02bbfb4e Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5834
diff changeset
22 import org.dive4elements.river.client.server.auth.Authentication;
821a02bbfb4e Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5834
diff changeset
23 import org.dive4elements.river.client.server.auth.AuthenticationException;
821a02bbfb4e Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5834
diff changeset
24 import org.dive4elements.river.client.server.auth.AuthenticationFactory;
821a02bbfb4e Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5834
diff changeset
25 import org.dive4elements.river.client.server.auth.User;
821a02bbfb4e Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5834
diff changeset
26 import org.dive4elements.river.client.server.auth.UserClient;
821a02bbfb4e Fixed internal java dependencies
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5834
diff changeset
27 import org.dive4elements.river.client.server.features.Features;
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
28
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
29 public class LoginServlet extends HttpServlet {
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
30
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
31 private static Logger logger = Logger.getLogger(LoginServlet.class);
4451
e2d8f344491e Use static variable for login page name in LoginServlet
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4450
diff changeset
32
4450
0074c113bb95 Be sure that a redirect url always exist
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4194
diff changeset
33 private static final String FLYS_PAGE = "FLYS.html";
4451
e2d8f344491e Use static variable for login page name in LoginServlet
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4450
diff changeset
34 private static final String LOGIN_PAGE = "login.jsp";
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
35
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
36 private void redirectFailure(HttpServletResponse resp, String path)
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
37 throws IOException {
4451
e2d8f344491e Use static variable for login page name in LoginServlet
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4450
diff changeset
38 resp.sendRedirect(path + "/" + LOGIN_PAGE);
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
39 }
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
40
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
41 private void redirectFailure(HttpServletResponse resp, String path,
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
42 Exception e) throws IOException {
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
43 this.redirectFailure(resp, path, e.getMessage());
2969
16c71457ed43 Display error details to the user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2956
diff changeset
44 }
16c71457ed43 Display error details to the user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2956
diff changeset
45
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
46 private void redirectFailure(HttpServletResponse resp, String path,
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
47 String message) throws IOException {
4451
e2d8f344491e Use static variable for login page name in LoginServlet
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4450
diff changeset
48 resp.sendRedirect(path + "/" + LOGIN_PAGE + "?error=" + message);
2984
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
49 }
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
50
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
51 private void redirectSuccess(HttpServletResponse resp, String path,
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
52 String uri) throws IOException {
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
53 if (uri == null) {
4194
17fe00c09b7c Don't redirect to request uri
Björn Ricks <bjoern.ricks@intevation.de>
parents: 3851
diff changeset
54 String redirecturl = getServletContext().getInitParameter("redirect-url");
4450
0074c113bb95 Be sure that a redirect url always exist
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4194
diff changeset
55 if (redirecturl == null) {
0074c113bb95 Be sure that a redirect url always exist
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4194
diff changeset
56 redirecturl = FLYS_PAGE;
0074c113bb95 Be sure that a redirect url always exist
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4194
diff changeset
57 }
4194
17fe00c09b7c Don't redirect to request uri
Björn Ricks <bjoern.ricks@intevation.de>
parents: 3851
diff changeset
58 uri = "/" + redirecturl;
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
59 }
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
60 resp.sendRedirect(uri);
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
61 }
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
62
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
63 @Override
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
64 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
65 throws ServletException, IOException {
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
66 logger.debug("Processing get request");
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
67 this.redirectFailure(resp, req.getContextPath());
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
68 }
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
69
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
70 @Override
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
71 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
3697
2e12518ff5b4 Removed trailing whitespace. Reverted functional change in parsing plain user file.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3696
diff changeset
72 throws ServletException, IOException
3696
a050cb5f303f Cosmetics
Christian Lins <christian.lins@intevation.de>
parents: 3503
diff changeset
73 {
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
74 String encoding = req.getCharacterEncoding();
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
75 String username = req.getParameter("username");
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
76 String password = req.getParameter("password");
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
77
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
78 logger.debug("Processing post request");
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
79
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
80 if (username == null || password == null) {
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
81 logger.debug("No username or password provided");
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
82 this.redirectFailure(resp, req.getContextPath());
3696
a050cb5f303f Cosmetics
Christian Lins <christian.lins@intevation.de>
parents: 3503
diff changeset
83 return;
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
84 }
3697
2e12518ff5b4 Removed trailing whitespace. Reverted functional change in parsing plain user file.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3696
diff changeset
85
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
86 try {
2956
d7f76f197d89 Refactor GGInA authentication
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2950
diff changeset
87 Authentication aresp = this.auth(username, password, encoding);
d7f76f197d89 Refactor GGInA authentication
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2950
diff changeset
88 if (aresp == null || !aresp.isSuccess()) {
3696
a050cb5f303f Cosmetics
Christian Lins <christian.lins@intevation.de>
parents: 3503
diff changeset
89 logger.debug("Authentication not successful");
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
90 this.redirectFailure(resp, req.getContextPath());
4489
fea3e4b6faba Return after sending a redirect
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4451
diff changeset
91 return;
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
92 }
2984
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
93 User user = aresp.getUser();
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
94
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
95 String url = getServletContext().getInitParameter("server-url");
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
96 UserClient client = new UserClient(url);
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
97 if (!client.userExists(user)) {
3503
56f17c6c6288 Add debug output if a database user will be created
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3485
diff changeset
98 logger.debug("Creating db user");
2984
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
99 if (!client.createUser(user)) {
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
100 this.redirectFailure(resp, req.getContextPath(),
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
101 "Could not create new user");
4489
fea3e4b6faba Return after sending a redirect
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4451
diff changeset
102 return;
2984
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
103 }
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
104 }
06d999e95615 Add UserClient class to handle REST communication for user related interfaces.
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2972
diff changeset
105
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
106 HttpSession session = req.getSession();
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
107 session.setAttribute("user", user);
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
108
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
109 String uri = (String)session.getAttribute("requesturi");
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
110
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
111 this.redirectSuccess(resp, req.getContextPath(), uri);
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
112 }
2956
d7f76f197d89 Refactor GGInA authentication
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2950
diff changeset
113 catch(AuthenticationException e) {
4490
82cc03e5f1c4 Add stack trace if authentication was not successfull
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4489
diff changeset
114 logger.error(e, e);
3851
a4c9296f6efa Use the Context PATH servlet variable when using URLs in the GGInAFilter
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 3697
diff changeset
115 this.redirectFailure(resp, req.getContextPath(), e);
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
116 }
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
117 }
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
118
2956
d7f76f197d89 Refactor GGInA authentication
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2950
diff changeset
119 private Authentication auth(String username, String password, String encoding)
3697
2e12518ff5b4 Removed trailing whitespace. Reverted functional change in parsing plain user file.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3696
diff changeset
120 throws AuthenticationException, IOException
3696
a050cb5f303f Cosmetics
Christian Lins <christian.lins@intevation.de>
parents: 3503
diff changeset
121 {
3485
71ba3cf3ec5e Refactor Authentication to allow to pass the Freatures to the user class
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2984
diff changeset
122 ServletContext sc = this.getServletContext();
71ba3cf3ec5e Refactor Authentication to allow to pass the Freatures to the user class
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2984
diff changeset
123 Features features = (Features)sc.getAttribute(Features.CONTEXT_ATTRIBUTE);
71ba3cf3ec5e Refactor Authentication to allow to pass the Freatures to the user class
Bjoern Ricks <bjoern.ricks@intevation.de>
parents: 2984
diff changeset
124 String auth = sc.getInitParameter("authentication");
4451
e2d8f344491e Use static variable for login page name in LoginServlet
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4450
diff changeset
125 return AuthenticationFactory.getInstance(auth).auth(username, password,
5933
1b939742629e Pass LoginServlet's ServletContext to the Authenticators.
Bernhard Herzog <bh@intevation.de>
parents: 5861
diff changeset
126 encoding, features, sc);
2950
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
127 }
192eddbbd4cf Implement a login page to be able to authenticate a user
Bjoern Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
128 }

http://dive4elements.wald.intevation.org