@Override
    public Set<AuthenticationHandler> resolveAuthenticationHandlers() {
        val clientInfo = Objects.requireNonNull(ClientInfoHolder.getClientInfo(), "Client info cannot be null");
        val handlers = authenticationHandlerPrincipalResolverMap
            .keySet()
            .stream()
            .filter(BeanSupplier::isNotProxy)
            .filter(handler -> {
                if (StringUtils.isNotBlank(clientInfo.getTenant())) {
                    val tenantDefinition = tenantExtractor.getTenantsManager().findTenant(clientInfo.getTenant()).orElseThrow();
                    val authenticationHandlers = tenantDefinition.getAuthenticationPolicy().getAuthenticationHandlers();
                    return authenticationHandlers == null || authenticationHandlers.isEmpty() || authenticationHandlers.contains(handler.getName());
                }
                return true;
            })
            .collect(Collectors.toList());

        if (StringUtils.isNotBlank(clientInfo.getTenant())) {
            val tenantDefinition = tenantExtractor.getTenantsManager().findTenant(clientInfo.getTenant()).orElseThrow();
            if (!tenantDefinition.getProperties().isEmpty()) {
                getTenantAuthenticationHandlerBuilders()
                    .stream()
                    .map(builder -> builder.build(tenantDefinition))
                    .forEach(handlers::addAll);
            }
        }

        AnnotationAwareOrderComparator.sort(handlers);
        return Set.copyOf(handlers);
    }
This is {@link DefaultAuthenticationEventExecutionPlan}.

@author Misagh Moayyed
@since 5.1.0
core/cas-server-core-authentication-api/src/main/java/org/apereo/cas/authentication/DefaultAuthenticationEventExecutionPlan.java