| | |
| | | |
| | | @Override |
| | | public AuthenticationManager stop() { |
| | | for (AuthenticationProvider provider : authenticationProviders) { |
| | | try { |
| | | provider.stop(); |
| | | } catch (Exception e) { |
| | | logger.error("Failed to stop " + provider.getClass().getSimpleName(), e); |
| | | } |
| | | } |
| | | return this; |
| | | } |
| | | |
| | | public void addAuthenticationProvider(AuthenticationProvider prov) { |
| | | authenticationProviders.add(prov); |
| | | } |
| | | |
| | | /** |
| | |
| | | flagWicketSession(AuthenticationType.CONTAINER); |
| | | logger.debug(MessageFormat.format("{0} authenticated by servlet container principal from {1}", |
| | | user.username, httpRequest.getRemoteAddr())); |
| | | return user; |
| | | return validateAuthentication(user, AuthenticationType.CONTAINER); |
| | | } else if (settings.getBoolean(Keys.realm.container.autoCreateAccounts, false) |
| | | && !internalAccount) { |
| | | // auto-create user from an authenticated container principal |
| | |
| | | flagWicketSession(AuthenticationType.CONTAINER); |
| | | logger.debug(MessageFormat.format("{0} authenticated and created by servlet container principal from {1}", |
| | | user.username, httpRequest.getRemoteAddr())); |
| | | return user; |
| | | return validateAuthentication(user, AuthenticationType.CONTAINER); |
| | | } else if (!internalAccount) { |
| | | logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted servlet container authentication from {1}", |
| | | principal.getName(), httpRequest.getRemoteAddr())); |
| | |
| | | flagWicketSession(AuthenticationType.CERTIFICATE); |
| | | logger.debug(MessageFormat.format("{0} authenticated by client certificate {1} from {2}", |
| | | user.username, metadata.serialNumber, httpRequest.getRemoteAddr())); |
| | | return user; |
| | | return validateAuthentication(user, AuthenticationType.CERTIFICATE); |
| | | } else { |
| | | logger.warn(MessageFormat.format("Failed to find UserModel for {0}, attempted client certificate ({1}) authentication from {2}", |
| | | model.username, metadata.serialNumber, httpRequest.getRemoteAddr())); |
| | |
| | | flagWicketSession(AuthenticationType.COOKIE); |
| | | logger.debug(MessageFormat.format("{0} authenticated by cookie from {1}", |
| | | user.username, httpRequest.getRemoteAddr())); |
| | | return user; |
| | | return validateAuthentication(user, AuthenticationType.COOKIE); |
| | | } |
| | | } |
| | | |
| | |
| | | flagWicketSession(AuthenticationType.CREDENTIALS); |
| | | logger.debug(MessageFormat.format("{0} authenticated by BASIC request header from {1}", |
| | | user.username, httpRequest.getRemoteAddr())); |
| | | return user; |
| | | return validateAuthentication(user, AuthenticationType.CREDENTIALS); |
| | | } else { |
| | | logger.warn(MessageFormat.format("Failed login attempt for {0}, invalid credentials from {1}", |
| | | username, httpRequest.getRemoteAddr())); |
| | |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * This method allows the authentication manager to reject authentication |
| | | * attempts. It is called after the username/secret have been verified to |
| | | * ensure that the authentication technique has been logged. |
| | | * |
| | | * @param user |
| | | * @return |
| | | */ |
| | | protected UserModel validateAuthentication(UserModel user, AuthenticationType type) { |
| | | if (user == null) { |
| | | return null; |
| | | } |
| | | if (user.disabled) { |
| | | // user has been disabled |
| | | logger.warn("Rejected {} authentication attempt by disabled account \"{}\"", |
| | | type, user.username); |
| | | return null; |
| | | } |
| | | return user; |
| | | } |
| | | |
| | | protected void flagWicketSession(AuthenticationType authenticationType) { |
| | |
| | | |
| | | // try local authentication |
| | | if (user != null && user.isLocalAccount()) { |
| | | UserModel returnedUser = null; |
| | | if (user.password.startsWith(StringUtils.MD5_TYPE)) { |
| | | // password digest |
| | | String md5 = StringUtils.MD5_TYPE + StringUtils.getMD5(new String(password)); |
| | | if (user.password.equalsIgnoreCase(md5)) { |
| | | returnedUser = user; |
| | | } |
| | | } else if (user.password.startsWith(StringUtils.COMBINED_MD5_TYPE)) { |
| | | // username+password digest |
| | | String md5 = StringUtils.COMBINED_MD5_TYPE |
| | | + StringUtils.getMD5(username.toLowerCase() + new String(password)); |
| | | if (user.password.equalsIgnoreCase(md5)) { |
| | | returnedUser = user; |
| | | } |
| | | } else if (user.password.equals(new String(password))) { |
| | | // plain-text password |
| | | returnedUser = user; |
| | | } |
| | | return returnedUser; |
| | | return authenticateLocal(user, password); |
| | | } |
| | | |
| | | // try registered external authentication providers |
| | | if (user == null) { |
| | | for (AuthenticationProvider provider : authenticationProviders) { |
| | | if (provider instanceof UsernamePasswordAuthenticationProvider) { |
| | | user = provider.authenticate(usernameDecoded, password); |
| | | if (user != null) { |
| | | // user authenticated |
| | | user.accountType = provider.getAccountType(); |
| | | return user; |
| | | } |
| | | for (AuthenticationProvider provider : authenticationProviders) { |
| | | if (provider instanceof UsernamePasswordAuthenticationProvider) { |
| | | UserModel returnedUser = provider.authenticate(usernameDecoded, password); |
| | | if (returnedUser != null) { |
| | | // user authenticated |
| | | returnedUser.accountType = provider.getAccountType(); |
| | | return validateAuthentication(returnedUser, AuthenticationType.CREDENTIALS); |
| | | } |
| | | } |
| | | } |
| | | return user; |
| | | |
| | | // could not authenticate locally or with a provider |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * Returns a UserModel if local authentication succeeds. |
| | | * |
| | | * @param user |
| | | * @param password |
| | | * @return a UserModel if local authentication succeeds, null otherwise |
| | | */ |
| | | protected UserModel authenticateLocal(UserModel user, char [] password) { |
| | | UserModel returnedUser = null; |
| | | if (user.password.startsWith(StringUtils.MD5_TYPE)) { |
| | | // password digest |
| | | String md5 = StringUtils.MD5_TYPE + StringUtils.getMD5(new String(password)); |
| | | if (user.password.equalsIgnoreCase(md5)) { |
| | | returnedUser = user; |
| | | } |
| | | } else if (user.password.startsWith(StringUtils.COMBINED_MD5_TYPE)) { |
| | | // username+password digest |
| | | String md5 = StringUtils.COMBINED_MD5_TYPE |
| | | + StringUtils.getMD5(user.username.toLowerCase() + new String(password)); |
| | | if (user.password.equalsIgnoreCase(md5)) { |
| | | returnedUser = user; |
| | | } |
| | | } else if (user.password.equals(new String(password))) { |
| | | // plain-text password |
| | | returnedUser = user; |
| | | } |
| | | return validateAuthentication(returnedUser, AuthenticationType.CREDENTIALS); |
| | | } |
| | | |
| | | /** |