Skip to content

Commit 713ab7f

Browse files
Issue #5442 - update the tests for MultiAuthenticator
Signed-off-by: Lachlan Roberts <[email protected]>
1 parent 9d0d9c4 commit 713ab7f

File tree

1 file changed

+109
-35
lines changed

1 file changed

+109
-35
lines changed

tests/test-integration/src/test/java/org/eclipse/jetty/test/MultiAuthenticatorTest.java

Lines changed: 109 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@
1414
package org.eclipse.jetty.test;
1515

1616
import java.io.PrintWriter;
17+
import java.net.URI;
1718
import java.nio.file.Path;
1819
import java.util.Map;
1920

21+
import org.eclipse.jetty.client.ContentResponse;
22+
import org.eclipse.jetty.client.FormRequestContent;
2023
import org.eclipse.jetty.client.HttpClient;
2124
import org.eclipse.jetty.http.HttpHeader;
25+
import org.eclipse.jetty.http.HttpStatus;
2226
import org.eclipse.jetty.io.Content;
2327
import org.eclipse.jetty.security.AnyUserLoginService;
2428
import org.eclipse.jetty.security.AuthenticationState;
@@ -48,6 +52,10 @@
4852
import org.junit.jupiter.api.BeforeEach;
4953
import org.junit.jupiter.api.Test;
5054

55+
import static org.hamcrest.MatcherAssert.assertThat;
56+
import static org.hamcrest.Matchers.containsString;
57+
import static org.hamcrest.Matchers.equalTo;
58+
5159
public class MultiAuthenticatorTest
5260
{
5361
private Server _server;
@@ -64,7 +72,6 @@ public void before() throws Exception
6472

6573
_server = new Server();
6674
_connector = new ServerConnector(_server);
67-
_connector.setPort(8080); // TODO: remove.
6875
_server.addConnector(_connector);
6976

7077
OpenIdConfiguration config = new OpenIdConfiguration(_provider.getProvider(), _provider.getClientId(), _provider.getClientSecret());
@@ -77,6 +84,7 @@ public void before() throws Exception
7784
securityHandler.setHandler(new AuthTestHandler());
7885

7986
MultiAuthenticator multiAuthenticator = new MultiAuthenticator();
87+
multiAuthenticator.setLoginPath("/login");
8088

8189
OpenIdAuthenticator openIdAuthenticator = new OpenIdAuthenticator(config, "/error");
8290
openIdAuthenticator.setRedirectPath("/redirect_path");
@@ -116,15 +124,63 @@ public void after() throws Exception
116124
}
117125

118126
@Test
119-
public void test() throws Exception
127+
public void testMultiAuthentication() throws Exception
120128
{
121-
_server.join();
129+
URI uri = URI.create("http://localhost:" + _connector.getLocalPort());
130+
ContentResponse response = _client.GET(uri);
131+
assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
132+
assertThat(response.getContentAsString(), containsString("<h1>Multi Login Page</h1>"));
133+
assertThat(response.getContentAsString(), containsString("/login/openid"));
134+
assertThat(response.getContentAsString(), containsString("/login/form"));
135+
136+
// Try Form Login.
137+
response = _client.GET(uri.resolve("/login/form"));
138+
assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
139+
assertThat(response.getContentAsString(), containsString("<form action=\"j_security_check\" method=\"POST\">"));
140+
141+
// Form login is successful.
142+
Fields fields = new Fields();
143+
fields.put("j_username", "user");
144+
fields.put("j_password", "password");
145+
response = _client.POST(uri.resolve("/j_security_check"))
146+
.body(new FormRequestContent(fields))
147+
.send();
148+
assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
149+
assertThat(response.getContentAsString(), containsString("userPrincipal: user"));
150+
assertThat(response.getContentAsString(), containsString("MultiAuthenticator$MultiSucceededAuthenticationState"));
151+
152+
// Logout is successful.
153+
response = _client.GET(uri.resolve("/logout"));
154+
assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
155+
assertThat(response.getContentAsString(), containsString("<h1>Multi Login Page</h1>"));
156+
assertThat(response.getContentAsString(), containsString("/login/openid"));
157+
assertThat(response.getContentAsString(), containsString("/login/form"));
158+
159+
// We can now log in with OpenID.
160+
_provider.setUser(new OpenIdProvider.User("UserId1234", "openIdUser"));
161+
response = _client.GET(uri.resolve("/login/openid"));
162+
assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
163+
assertThat(response.getContentAsString(), containsString("userPrincipal: UserId1234"));
164+
assertThat(response.getContentAsString(), containsString("Authenticated with OpenID"));
165+
assertThat(response.getContentAsString(), containsString("name: openIdUser"));
166+
167+
// Logout is successful.
168+
response = _client.GET(uri.resolve("/logout"));
169+
assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
170+
assertThat(response.getContentAsString(), containsString("<h1>Multi Login Page</h1>"));
171+
assertThat(response.getContentAsString(), containsString("/login/openid"));
172+
assertThat(response.getContentAsString(), containsString("/login/form"));
122173
}
123174

124-
@Test
125-
public void test2() throws Exception
175+
private static AuthenticationState.Succeeded getAuthentication(Request request)
126176
{
127-
_server.join();
177+
AuthenticationState authenticationState = AuthenticationState.getAuthenticationState(request);
178+
AuthenticationState.Succeeded auth = null;
179+
if (authenticationState instanceof AuthenticationState.Succeeded succeeded)
180+
auth = succeeded;
181+
else if (authenticationState instanceof AuthenticationState.Deferred deferred)
182+
auth = deferred.authenticate(request);
183+
return auth;
128184
}
129185

130186
private static class AuthTestHandler extends Handler.Abstract
@@ -139,51 +195,67 @@ else if (pathInContext.startsWith("/logout"))
139195
return onLogout(request, response, callback);
140196
else if (pathInContext.startsWith("/login/form"))
141197
return onFormLogin(request, response, callback);
198+
else if (pathInContext.startsWith("/login/openid"))
199+
return onOpenIdLogin(request, response, callback);
142200

143201
try (PrintWriter writer = new PrintWriter(Content.Sink.asOutputStream(response)))
144202
{
145-
AuthenticationState authenticationState = AuthenticationState.getAuthenticationState(request);
203+
146204
response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/html");
147-
writer.println("<b>authState: " + authenticationState + "</b><br>");
148-
if (authenticationState instanceof AuthenticationState.Deferred deferred)
205+
AuthenticationState.Succeeded auth = getAuthentication(request);
206+
if (auth != null)
149207
{
150-
AuthenticationState.Succeeded succeeded = deferred.authenticate(request);
151-
if (succeeded != null)
152-
writer.println("<b>userPrincipal: " + succeeded.getUserPrincipal() + "</b><br>");
153-
else
154-
writer.println("<b>userPrincipal: null</b><br>");
155-
}
156-
else if (authenticationState != null)
157-
{
158-
writer.println("<b>userPrincipal: " + authenticationState.getUserPrincipal() + "</b><br>");
159-
}
208+
writer.println("<b>authState: " + auth + "</b><br>");
209+
writer.println("<b>userPrincipal: " + auth.getUserPrincipal() + "</b><br>");
160210

161-
Session session = request.getSession(true);
162-
@SuppressWarnings("unchecked")
163-
Map<String, Object> claims = (Map<String, Object>)session.getAttribute(OpenIdAuthenticator.CLAIMS);
164-
if (claims != null)
211+
Session session = request.getSession(true);
212+
@SuppressWarnings("unchecked")
213+
Map<String, Object> claims = (Map<String, Object>)session.getAttribute(OpenIdAuthenticator.CLAIMS);
214+
if (claims != null)
215+
{
216+
writer.printf("""
217+
<br><b>Authenticated with OpenID</b><br>
218+
userId: %s<br>
219+
name: %s<br>
220+
email: %s<br>
221+
""", claims.get("sub"), claims.get("name"), claims.get("email"));
222+
}
223+
224+
writer.println("""
225+
<hr>
226+
<a href="/logout">Logout</a><br>
227+
""");
228+
}
229+
else
165230
{
166-
writer.printf("""
167-
<br><b>Authenticated with OpenID</b><br>
168-
userId: %s<br>
169-
name: %s<br>
170-
email: %s<br>
171-
""", claims.get("sub"), claims.get("name"), claims.get("email"));
231+
writer.println("""
232+
<h1>Multi Login Page</h1>
233+
<a href="/login/openid">OpenID Login</a><br>
234+
<a href="/login/form">Form Login</a><br>
235+
<a href="/logout">Logout</a><br>
236+
""");
172237
}
173-
174-
writer.println("""
175-
<a href="/login/openid">OpenID Login</a><br>
176-
<a href="/login/form">Form Login</a><br>
177-
<a href="/logout">Logout</a><br>
178-
""");
179238
}
180239

181240
callback.succeeded();
182241
return true;
183242
}
184243

244+
private boolean onOpenIdLogin(Request request, Response response, Callback callback) throws Exception
245+
{
246+
Response.sendRedirect(request, response, callback, "/");
247+
return true;
248+
}
249+
185250
private boolean onFormLogin(Request request, Response response, Callback callback) throws Exception
186251
{
252+
AuthenticationState.Succeeded authentication = getAuthentication(request);
253+
if (authentication != null)
254+
{
255+
Response.sendRedirect(request, response, callback, "/");
256+
return true;
257+
}
258+
187259
String content = """
188260
<h2>Login</h2>
189261
<form action="j_security_check" method="POST">
@@ -199,6 +271,8 @@ private boolean onFormLogin(Request request, Response response, Callback callbac
199271
<button type="submit">Login</button>
200272
</div>
201273
</form>
274+
<p>Username: user or admin<br>
275+
Password: password</p>
202276
""";
203277
response.write(true, BufferUtil.toBuffer(content), callback);
204278
return true;

0 commit comments

Comments
 (0)