@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
    // CHECKSTYLE:ON
    public final Subject authenticate(final String domain, final String userName, final char[] password,
                                      final PasswordValidator passwordValidator)
            throws LoginException {

        // make sure the credentials are not null
        if (domain == null || userName == null || password == null) {
            throw new LoginException("The credentials cannot be null");
        }

        // SQL query is required
        if (StringUtils.isBlank(dbProps.get().getSqlUserQuery())) {
            final String error = "Invalid SQL user authentication query (query is null or empty)";
            LOG.warn(error);
            throw new LoginException(error);
        }

        final UserRecord userRecord = getUserRecord(domain, userName);

        if (userRecord.getUserId() == null || userRecord.getUserId().length() == 0) {
            final String error = "User ID for username '" + userName + "' is null or empty in the database";
            LOG.warn(error);
            throw new LoginException(error);
        }

        if (userRecord.getCredential() == null || userRecord.getCredential().length() == 0) {
            final String error = "Credential for username '" + userName + "' / user ID '" + userRecord.getUserId()
                    + "' is null or empty in the database";
            LOG.warn(error);
            throw new LoginException(error);
        }

        // no need for defensive copies of Strings, but create a defensive copy of the password
        final char[] myPassword = password.clone();

        // convert the credential string to a char array
        final char[] myCredential = userRecord.getCredential().toCharArray();

        if (!passwordValidator.validate(myPassword, myCredential)) {
            final String error = "Invalid password for username '" + userName + "'";
            LOG.info(error);
            throw new FailedLoginException(error);
        }

        // The authentication was successful!
        // Create the subject and clean up confidential data as far as possible.

        // clear the char representation of the credential
        Cleanser.wipe(myCredential);

        // clear the defensive copy of the password created earlier
        Cleanser.wipe(myPassword);

        // create a principal that includes the username and domain name that were used to authenticate the user
        final UserPrincipal userPrincipal = new UserPrincipal(userRecord.getUserId(), domain, userName);

        // wrap the principal in a Subject
        final Subject subject = new Subject();
        subject.getPrincipals().add(userPrincipal);

        return subject;
    }
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
    
    public final Subject authenticate(final String domain, final String userName, final char[] password,
                                      final PasswordValidator passwordValidator)
            throws LoginException {

        
        if (domain == null || userName == null || password == null) {
            throw new LoginException("The credentials cannot be null");
        }

        
        if (StringUtils.isBlank(dbProps.get().getSqlUserQuery())) {
            final String error = "Invalid SQL user authentication query (query is null or empty)";
            LOG.warn(error);
            throw new LoginException(error);
        }

        final UserRecord userRecord = getUserRecord(domain, userName);

        if (userRecord.getUserId() == null || userRecord.getUserId().length() == 0) {
            final String error = "User ID for username '" + userName + "' is null or empty in the database";
            LOG.warn(error);
            throw new LoginException(error);
        }

        if (userRecord.getCredential() == null || userRecord.getCredential().length() == 0) {
            final String error = "Credential for username '" + userName + "' / user ID '" + userRecord.getUserId()
                    + "' is null or empty in the database";
            LOG.warn(error);
            throw new LoginException(error);
        }

        
        final char[] myPassword = password.clone();

        
        final char[] myCredential = userRecord.getCredential().toCharArray();

        if (!passwordValidator.validate(myPassword, myCredential)) {
            final String error = "Invalid password for username '" + userName + "'";
            LOG.info(error);
            throw new FailedLoginException(error);
        }

        
        

        
        Cleanser.wipe(myCredential);

        
        Cleanser.wipe(myPassword);

        
        final UserPrincipal userPrincipal = new UserPrincipal(userRecord.getUserId(), domain, userName);

        
        final Subject subject = new Subject();
        subject.getPrincipals().add(userPrincipal);

        return subject;
    }
@ SuppressWarnings ( { "PMD.CyclomaticComplexity" , "PMD.NPathComplexity" } ) // CHECKSTYLE:ON public final Subject authenticate ( final String domain , final String userName , final char [ ] password , final PasswordValidator passwordValidator ) throws LoginException { // make sure the credentials are not null if ( domain == null || userName == null || password == null ) { throw new LoginException ( "The credentials cannot be null" ) ; } // SQL query is required if ( StringUtils . isBlank ( dbProps . get ( ) . getSqlUserQuery ( ) ) ) { final String error = "Invalid SQL user authentication query (query is null or empty)" ; LOG . warn ( error ) ; throw new LoginException ( error ) ; } final UserRecord userRecord = getUserRecord ( domain , userName ) ; if ( userRecord . getUserId ( ) == null || userRecord . getUserId ( ) . length ( ) == 0 ) { final String error = "User ID for username '" + userName + "' is null or empty in the database" ; LOG . warn ( error ) ; throw new LoginException ( error ) ; } if ( userRecord . getCredential ( ) == null || userRecord . getCredential ( ) . length ( ) == 0 ) { final String error = "Credential for username '" + userName + "' / user ID '" + userRecord . getUserId ( ) + "' is null or empty in the database" ; LOG . warn ( error ) ; throw new LoginException ( error ) ; } // no need for defensive copies of Strings, but create a defensive copy of the password final char [ ] myPassword = password . clone ( ) ; // convert the credential string to a char array final char [ ] myCredential = userRecord . getCredential ( ) . toCharArray ( ) ; if ( ! passwordValidator . validate ( myPassword , myCredential ) ) { final String error = "Invalid password for username '" + userName + "'" ; LOG . info ( error ) ; throw new FailedLoginException ( error ) ; } // The authentication was successful! // Create the subject and clean up confidential data as far as possible. // clear the char representation of the credential Cleanser . wipe ( myCredential ) ; // clear the defensive copy of the password created earlier Cleanser . wipe ( myPassword ) ; // create a principal that includes the username and domain name that were used to authenticate the user final UserPrincipal userPrincipal = new UserPrincipal ( userRecord . getUserId ( ) , domain , userName ) ; // wrap the principal in a Subject final Subject subject = new Subject ( ) ; subject . getPrincipals ( ) . add ( userPrincipal ) ; return subject ; }
CHECKSTYLE:OFF
CHECKSTYLE : OFF