@Bean
        @ConditionalOnMissingBean(name = PrincipalResolver.BEAN_NAME_PRINCIPAL_RESOLVER)
        @RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
        public PrincipalResolver defaultPrincipalResolver(
            @Qualifier(TenantExtractor.BEAN_NAME)
            final TenantExtractor tenantExtractor,
            final List<PrincipalResolutionExecutionPlanConfigurer> configurers,
            final CasConfigurationProperties casProperties,
            @Qualifier(PrincipalElectionStrategy.BEAN_NAME)
            final PrincipalElectionStrategy principalElectionStrategy) {
            val plan = new DefaultPrincipalResolutionExecutionPlan();
            val sortedConfigurers = new ArrayList<>(configurers);
            AnnotationAwareOrderComparator.sortIfNecessary(sortedConfigurers);
            sortedConfigurers.forEach(Unchecked.consumer(cfg -> {
                LOGGER.trace("Configuring principal resolution execution plan [{}]", cfg.getName());
                cfg.configurePrincipalResolutionExecutionPlan(plan);
            }));
            plan.registerPrincipalResolver(new EchoingPrincipalResolver());
            val registeredPrincipalResolvers = plan.getRegisteredPrincipalResolvers();
            return new ChainingPrincipalResolver(principalElectionStrategy, tenantExtractor,
                registeredPrincipalResolvers, casProperties);
        }
This is {@link CasCoreAuthenticationPrincipalConfiguration}.

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