Fixing validation error in unit tests

This commit is contained in:
Martin Stockhammer 2016-10-16 16:49:38 +02:00
parent 2aa6cdf6c6
commit 78d822d145
3 changed files with 71 additions and 77 deletions

View File

@ -41,7 +41,7 @@ import java.util.Map;
/** /**
* DefaultAuthenticationManager: the goal of the authentication manager is to act as a conduit for * DefaultAuthenticationManager: the goal of the authentication manager is to act as a conduit for
* authentication requests into different authentication schemes * authentication requests into different authentication schemes
* * <p>
* For example, the default implementation can be configured with any number of authenticators and will * For example, the default implementation can be configured with any number of authenticators and will
* sequentially try them for an authenticated result. This allows you to have the standard user/pass * sequentially try them for an authenticated result. This allows you to have the standard user/pass
* auth procedure followed by authentication based on a known key for 'remember me' type functionality. * auth procedure followed by authentication based on a known key for 'remember me' type functionality.
@ -50,10 +50,9 @@ import java.util.Map;
*/ */
@Service("authenticationManager") @Service("authenticationManager")
public class DefaultAuthenticationManager public class DefaultAuthenticationManager
implements AuthenticationManager implements AuthenticationManager {
{
private Logger log = LoggerFactory.getLogger( getClass() ); private Logger log = LoggerFactory.getLogger(getClass());
private List<Authenticator> authenticators; private List<Authenticator> authenticators;
@ -61,113 +60,96 @@ public class DefaultAuthenticationManager
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
@Inject @Inject
@Named( value = "userManager#default" ) @Named(value = "userManager#default")
private UserManager userManager; private UserManager userManager;
@SuppressWarnings( "unchecked" ) @SuppressWarnings("unchecked")
@PostConstruct @PostConstruct
public void initialize() public void initialize() {
{
this.authenticators = this.authenticators =
new ArrayList<Authenticator>( applicationContext.getBeansOfType( Authenticator.class ).values() ); new ArrayList<Authenticator>(applicationContext.getBeansOfType(Authenticator.class).values());
} }
public String getId() public String getId() {
{
return "Default Authentication Manager - " + this.getClass().getName() + " : managed authenticators - " + return "Default Authentication Manager - " + this.getClass().getName() + " : managed authenticators - " +
knownAuthenticators(); knownAuthenticators();
} }
public AuthenticationResult authenticate( AuthenticationDataSource source ) public AuthenticationResult authenticate(AuthenticationDataSource source)
throws AccountLockedException, AuthenticationException, MustChangePasswordException throws AccountLockedException, AuthenticationException, MustChangePasswordException {
{ if (authenticators == null || authenticators.size() == 0) {
if ( authenticators == null || authenticators.size() == 0 ) return (new AuthenticationResult(false, null, new AuthenticationException(
{ "no valid authenticators, can't authenticate")));
return ( new AuthenticationResult( false, null, new AuthenticationException(
"no valid authenticators, can't authenticate" ) ) );
} }
// put AuthenticationResult exceptions in a map // put AuthenticationResult exceptions in a map
List<AuthenticationFailureCause> authnResultErrors = new ArrayList<AuthenticationFailureCause>(); List<AuthenticationFailureCause> authnResultErrors = new ArrayList<AuthenticationFailureCause>();
for ( Authenticator authenticator : authenticators ) for (Authenticator authenticator : authenticators) {
{ if (authenticator.isValid()) {
if ( authenticator.isValid() && authenticator.supportsDataSource( source ) ) if (authenticator.supportsDataSource(source)) {
{ AuthenticationResult authResult = authenticator.authenticate(source);
AuthenticationResult authResult = authenticator.authenticate( source ); List<AuthenticationFailureCause> authenticationFailureCauses =
List<AuthenticationFailureCause> authenticationFailureCauses = authResult.getAuthenticationFailureCauses();
authResult.getAuthenticationFailureCauses();
if ( authResult.isAuthenticated() ) if (authResult.isAuthenticated()) {
{ //olamy: as we can chain various user managers with Archiva
//olamy: as we can chain various user managers with Archiva // user manager authenticator can lock accounts in the following case :
// user manager authenticator can lock accounts in the following case : // 2 user managers: ldap and jdo.
// 2 user managers: ldap and jdo. // ldap correctly find the user but cannot compare hashed password
// ldap correctly find the user but cannot compare hashed password // jdo reject password so increase loginAttemptCount
// jdo reject password so increase loginAttemptCount // now ldap bind authenticator work but loginAttemptCount has been increased.
// now ldap bind authenticator work but loginAttemptCount has been increased. // so we restore here loginAttemptCount to 0 if in authenticationFailureCauses
// so we restore here loginAttemptCount to 0 if in authenticationFailureCauses
for ( AuthenticationFailureCause authenticationFailureCause : authenticationFailureCauses ) for (AuthenticationFailureCause authenticationFailureCause : authenticationFailureCauses) {
{ User user = authenticationFailureCause.getUser();
User user = authenticationFailureCause.getUser(); if (user != null) {
if ( user != null ) if (user.getCountFailedLoginAttempts() > 0) {
{ user.setCountFailedLoginAttempts(0);
if ( user.getCountFailedLoginAttempts() > 0 ) if (!userManager.isReadOnly()) {
{ try {
user.setCountFailedLoginAttempts( 0 ); userManager.updateUser(user);
if ( !userManager.isReadOnly() ) } catch (UserManagerException e) {
{ log.debug(e.getMessage(), e);
try log.warn("skip error updating user: {}", e.getMessage());
{ }
userManager.updateUser( user );
}
catch ( UserManagerException e )
{
log.debug( e.getMessage(), e );
log.warn( "skip error updating user: {}", e.getMessage() );
} }
} }
} }
} }
return authResult;
} }
return authResult;
}
if ( authenticationFailureCauses != null ) if (authenticationFailureCauses != null) {
{ authnResultErrors.addAll(authenticationFailureCauses);
authnResultErrors.addAll( authenticationFailureCauses ); } else {
} if (authResult.getException() != null) {
else authnResultErrors.add(
{ new AuthenticationFailureCause(AuthenticationConstants.AUTHN_RUNTIME_EXCEPTION,
if ( authResult.getException() != null ) authResult.getException().getMessage()));
{ }
authnResultErrors.add(
new AuthenticationFailureCause( AuthenticationConstants.AUTHN_RUNTIME_EXCEPTION,
authResult.getException().getMessage() ) );
} }
} }
} else {
log.warn("Invalid authenticator found: " + authenticator.getId());
} }
} }
return ( new AuthenticationResult( false, null, new AuthenticationException( return (new AuthenticationResult(false, null, new AuthenticationException(
"authentication failed on authenticators: " + knownAuthenticators() ), authnResultErrors ) ); "authentication failed on authenticators: " + knownAuthenticators()), authnResultErrors));
} }
public List<Authenticator> getAuthenticators() public List<Authenticator> getAuthenticators() {
{
return authenticators; return authenticators;
} }
private String knownAuthenticators() private String knownAuthenticators() {
{
StringBuilder strbuf = new StringBuilder(); StringBuilder strbuf = new StringBuilder();
for ( Authenticator authenticator : authenticators ) for (Authenticator authenticator : authenticators) {
{ strbuf.append('(').append(authenticator.getId()).append(") ");
strbuf.append( '(' ).append( authenticator.getId() ).append( ") " );
} }
return strbuf.toString(); return strbuf.toString();

View File

@ -40,6 +40,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import java.util.ArrayList; import java.util.ArrayList;
@ -69,6 +70,11 @@ public class UserManagerAuthenticator
return "UserManagerAuthenticator"; return "UserManagerAuthenticator";
} }
@PostConstruct
private void init() {
super.valid = true;
}
/** /**
* @throws org.apache.archiva.redback.policy.AccountLockedException * @throws org.apache.archiva.redback.policy.AccountLockedException

View File

@ -39,6 +39,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
/** /**
@ -59,6 +60,11 @@ public class KeyStoreAuthenticator
@Resource(name = "userManager#default") @Resource(name = "userManager#default")
private UserManager userManager; private UserManager userManager;
@PostConstruct
private void init() {
super.valid=true;
}
public String getId() public String getId()
{ {
return getClass().getName(); return getClass().getName();