diff --git a/jetty-jaspi/src/test/java/org/eclipse/jetty/security/jaspi/BasicAuthModule.java b/jetty-jaspi/src/test/java/org/eclipse/jetty/security/jaspi/BasicAuthModule.java new file mode 100644 index 00000000000..d00b0f63d88 --- /dev/null +++ b/jetty-jaspi/src/test/java/org/eclipse/jetty/security/jaspi/BasicAuthModule.java @@ -0,0 +1,104 @@ +// +// ======================================================================== +// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.security.jaspi; + +import java.io.IOException; +import java.util.Map; +import javax.security.auth.Subject; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; +import javax.security.auth.message.AuthException; +import javax.security.auth.message.AuthStatus; +import javax.security.auth.message.MessageInfo; +import javax.security.auth.message.MessagePolicy; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.security.jaspi.modules.BaseAuthModule; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; +import org.eclipse.jetty.util.security.Constraint; + +public class BasicAuthModule extends BaseAuthModule +{ + private static final Logger LOG = Log.getLogger(BasicAuthModule.class); + + private String realmName; + + private static final String REALM_KEY = "org.eclipse.jetty.security.jaspi.modules.RealmName"; + + public BasicAuthModule() + { + } + + public BasicAuthModule(CallbackHandler callbackHandler, String realmName) + { + super(callbackHandler); + this.realmName = realmName; + } + + @Override + public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, + CallbackHandler handler, Map options) + throws AuthException + { + super.initialize(requestPolicy, responsePolicy, handler, options); + realmName = (String)options.get(REALM_KEY); + } + + @Override + public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, + Subject serviceSubject) + throws AuthException + { + HttpServletRequest request = (HttpServletRequest)messageInfo.getRequestMessage(); + HttpServletResponse response = (HttpServletResponse)messageInfo.getResponseMessage(); + String credentials = request.getHeader(HttpHeader.AUTHORIZATION.asString()); + + try + { + if (credentials != null) + { + if (LOG.isDebugEnabled()) + LOG.debug("Credentials: " + credentials); + if (login(clientSubject, credentials, Constraint.__BASIC_AUTH, messageInfo)) + { + return AuthStatus.SUCCESS; + } + } + + if (!isMandatory(messageInfo)) + { + return AuthStatus.SUCCESS; + } + response.setHeader(HttpHeader.WWW_AUTHENTICATE.asString(), "basic realm=\"" + realmName + '"'); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED); + return AuthStatus.SEND_CONTINUE; + } + catch (IOException e) + { + throw new AuthException(e.getMessage()); + } + catch (UnsupportedCallbackException e) + { + throw new AuthException(e.getMessage()); + } + } +} diff --git a/jetty-jaspi/src/test/resources/jaspi.xml b/jetty-jaspi/src/test/resources/jaspi.xml index 23a2ba5c7ed..1e31d2c996b 100644 --- a/jetty-jaspi/src/test/resources/jaspi.xml +++ b/jetty-jaspi/src/test/resources/jaspi.xml @@ -10,7 +10,7 @@ true - org.eclipse.jetty.security.jaspi.modules.BasicAuthModule + org.eclipse.jetty.security.jaspi.BasicAuthModule org.eclipse.jetty.security.jaspi.modules.RealmName=TestRealm