import java.io.IOException;
import java.security.Principal;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Set;
import javax.security.auth.Subject;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.LoginException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import org.opensaml.xml.util.DatatypeHelper;
-import org.opensaml.xml.util.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
String password = request.getParameter(passwordAttribute);
if (username == null || password == null) {
- redirectToLoginPage(request, response, null);
+ redirectToLoginPage(request, response);
return;
}
- if (authenticateUser(request, username, password)) {
+ try {
+ authenticateUser(request, username, password);
AuthenticationEngine.returnToAuthenticationEngine(request, response);
- } else {
- List<Pair<String, String>> queryParams = new ArrayList<Pair<String, String>>();
- queryParams.add(new Pair<String, String>(failureParam, "true"));
- redirectToLoginPage(request, response, queryParams);
+ } catch (LoginException e) {
+ request.setAttribute(failureParam, true);
+ request.setAttribute(LoginHandler.AUTHENTICATION_EXCEPTION_KEY, e);
+ redirectToLoginPage(request, response);
}
}
*
* @param request current request
* @param response current response
- * @param queryParams query parameters to pass to the login page
*/
- protected void redirectToLoginPage(HttpServletRequest request, HttpServletResponse response,
- List<Pair<String, String>> queryParams) {
+ protected void redirectToLoginPage(HttpServletRequest request, HttpServletResponse response) {
String requestContext = DatatypeHelper.safeTrimOrNullString(request.getContextPath());
if (requestContext == null) {
}
request.setAttribute("actionUrl", requestContext + request.getServletPath());
- if (queryParams != null) {
- for (Pair<String, String> param : queryParams) {
- request.setAttribute(param.getFirst(), param.getSecond());
- }
- }
-
try {
request.getRequestDispatcher(loginPage).forward(request, response);
log.debug("Redirecting to login page {}", loginPage);
* @param username the principal name of the user to be authenticated
* @param password the password of the user to be authenticated
*
- * @return true of authentication succeeds, false if not
+ * @throws LoginException thrown if there is a problem authenticating the user
*/
- protected boolean authenticateUser(HttpServletRequest request, String username, String password) {
+ protected void authenticateUser(HttpServletRequest request, String username, String password) throws LoginException {
try {
log.debug("Attempting to authenticate user {}", username);
Subject userSubject = new Subject(false, principals, publicCredentials, privateCredentials);
request.setAttribute(LoginHandler.SUBJECT_KEY, userSubject);
-
- return true;
+ } catch (LoginException e) {
+ log.debug("User authentication for " + username + " failed", e);
+ throw e;
} catch (Throwable e) {
log.debug("User authentication for " + username + " failed", e);
- return false;
+ throw new LoginException("unknown authentication error");
}
}