RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
boolean isAnonymous = workflowUserManager.isCurrentUserAnonymous();
UserSecurity us = DirectoryUtil.getUserSecurity();
if (us != null && us.getForceSessionTimeout() && !isAnonymous) {
throw new BadCredentialsException(ResourceBundleUtil.getMessage("authentication.failed.sessionTimeOut"));
}
Authentication auth = null;
// check for username/password in request
String username = super.obtainUsername(request);
String password = super.obtainPassword(request);
String loginAs = request.getParameter("loginAs");
String loginHash = request.getParameter("hash");
// Place the last username attempted into HttpSession for views
HttpSession session = request.getSession(false);
if (session != null || getAllowSessionCreation()) {
request.getSession().setAttribute(SPRING_SECURITY_LAST_USERNAME_KEY, TextUtils.escapeEntities(username));
}
if (username != null && (password != null || loginHash != null)) {
User currentUser = null;
//diable master login based on UserSecurity
if (us != null && us.getDisableHashLogin()) {
loginAs = null;
}
if (loginAs != null) {
String masterLoginUsername = getSetupManager().getSettingValue("masterLoginUsername");
String masterLoginPassword = getSetupManager().getSettingValue("masterLoginPassword");
//decryt masterLoginPassword
masterLoginPassword = SecurityUtil.decrypt(masterLoginPassword);
if ((masterLoginUsername != null && masterLoginUsername.trim().length() > 0) &&
(masterLoginPassword != null && masterLoginPassword.trim().length() > 0)) {
User master = new User();
master.setUsername(masterLoginUsername.trim());
master.setPassword(StringUtil.md5Base16(masterLoginPassword.trim()));
if (username.trim().equals(master.getUsername()) &&
((password != null && StringUtil.md5Base16(password.trim()).equalsIgnoreCase(master.getPassword())) ||
(loginHash != null && loginHash.trim().equalsIgnoreCase(master.getLoginHash())))) {
currentUser = directoryManager.getUserByUsername(loginAs);
if (currentUser != null) {
WorkflowUserDetails user = new WorkflowUserDetails(currentUser);
auth = new UsernamePasswordAuthenticationToken(user, user.getUsername(), user.getAuthorities());
super.setDetails(request, (UsernamePasswordAuthenticationToken) auth);
} else {
LogUtil.info(getClass().getName(), "Authentication for user " + loginAs + ": " + false);
WorkflowHelper workflowHelper = (WorkflowHelper) AppUtil.getApplicationContext().getBean("workflowHelper");
workflowHelper.addAuditTrail("WorkflowHttpAuthProcessingFilter", "authenticate", "Authentication for user " + loginAs + ": " + false);
throw new BadCredentialsException("");
}
}
}
} else {
if (loginHash != null) {
password = loginHash;
}
if (password != null) {
// use existing authentication manager
try {
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username.trim(), password.trim());
super.setDetails(request, authRequest);
auth = getAuthenticationManager().authenticate(authRequest);
// no direct way in Spring Security 2, so use reflection to clear password in token
Field field = null;
try {
field = auth.getClass().getDeclaredField("credentials");
field.setAccessible(true);
field.set(auth, null);
} catch (Exception ex) {
LogUtil.error(getClass().getName(), ex, "Error clearing credentials in token");
} finally {
if (field != null) {
field.setAccessible(false);
}
}
if (auth.isAuthenticated()) {
currentUser = directoryManager.getUserByUsername(username);
}
} catch (BadCredentialsException be) {
LogUtil.info(getClass().getName(), "Authentication for user " + ((loginAs == null) ? username : loginAs) + ": " + false);
WorkflowHelper workflowHelper = (WorkflowHelper) AppUtil.getApplicationContext().getBean("workflowHelper");
workflowHelper.addAuditTrail("WorkflowHttpAuthProcessingFilter", "authenticate", "Authentication for user " + ((loginAs == null) ? username : loginAs) + ": " + false);
throw be;
}
}
}
if (currentUser != null) {
workflowUserManager.setCurrentThreadUser(currentUser.getUsername());
}
if (!"/WEB-INF/jsp/unauthorized.jsp".equals(request.getServletPath())) {
LogUtil.info(getClass().getName(), "Authentication for user " + ((loginAs == null) ? username : loginAs) + ": " + true);
WorkflowHelper workflowHelper = (WorkflowHelper) AppUtil.getApplicationContext().getBean("workflowHelper");
workflowHelper.addAuditTrail("WorkflowHttpAuthProcessingFilter", "authenticate", "Authentication for user " + ((loginAs == null) ? username : loginAs) + ": " + true);
}
} else {
if (us != null && us.getAuthenticateAllApi()) {
throw new BadCredentialsException("");
}
}
return auth;
}