applicationEventPublisher.publishEvent(new AuthenticationSuccessEvent(result));
publishEvent(new AuthenticationSuccessEvent(result));
    public Authentication doAuthentication(Authentication authentication)        throws AuthenticationException {        Iterator iter = providers.iterator();        Class toTest = authentication.getClass();        AuthenticationException lastException = null;        while (iter.hasNext()) {            AuthenticationProvider provider = (AuthenticationProvider) iter.next();            if (provider.supports(toTest)) {                logger.debug("Authentication attempt using " + provider.getClass().getName());                Authentication result = null;                try {                    result = provider.authenticate(authentication);                    sessionController.checkAuthenticationAllowed(result);                } catch (AuthenticationException ae) {                    lastException = ae;                    result = null;                }                if (result != null) {                    sessionController.registerSuccessfulAuthentication(result);                    applicationEventPublisher.publishEvent(new AuthenticationSuccessEvent(result));                    return result;                }            }        }        if (lastException == null) {            lastException = new ProviderNotFoundException(messages.getMessage("ProviderManager.providerNotFound",                        new Object[] {toTest.getName()}, "No AuthenticationProvider found for {0}"));        }        // Publish the event        String className = exceptionMappings.getProperty(lastException.getClass().getName());        AbstractAuthenticationEvent event = null;        if (className != null) {            try {                Class clazz = getClass().getClassLoader().loadClass(className);                Constructor constructor = clazz.getConstructor(new Class[] {                            Authentication.class, AuthenticationException.class                        });                Object obj = constructor.newInstance(new Object[] {authentication, lastException});                Assert.isInstanceOf(AbstractAuthenticationEvent.class, obj, "Must be an AbstractAuthenticationEvent");                event = (AbstractAuthenticationEvent) obj;            } catch (ClassNotFoundException ignored) {}            catch (NoSuchMethodException ignored) {}            catch (IllegalAccessException ignored) {}            catch (InstantiationException ignored) {}            catch (InvocationTargetException ignored) {}        }        if (event != null) {            applicationEventPublisher.publishEvent(event);        } else {            if (logger.isDebugEnabled()) {                logger.debug("No event was found for the exception " + lastException.getClass().getName());            }        }        // Throw the exception        throw lastException;    }