33import io .kafbat .ui .service .rbac .AccessControlService ;
44import io .kafbat .ui .service .rbac .extractor .RbacActiveDirectoryAuthoritiesExtractor ;
55import io .kafbat .ui .service .rbac .extractor .RbacLdapAuthoritiesExtractor ;
6+ import io .kafbat .ui .util .CustomSslSocketFactory ;
67import io .kafbat .ui .util .StaticFileWebFilter ;
78import java .util .Collection ;
89import java .util .List ;
10+ import java .util .Map ;
911import java .util .Optional ;
12+ import java .util .stream .Stream ;
1013import lombok .RequiredArgsConstructor ;
1114import lombok .extern .slf4j .Slf4j ;
1215import org .springframework .beans .factory .annotation .Autowired ;
4750@ RequiredArgsConstructor
4851@ Slf4j
4952public class LdapSecurityConfig extends AbstractAuthSecurityConfig {
53+ private static final Map <String , Object > BASE_ENV_PROPS = Map .of (
54+ "java.naming.ldap.factory.socket" , CustomSslSocketFactory .class .getName ()
55+ );
5056
5157 private final LdapProperties props ;
5258
@@ -63,13 +69,10 @@ public AbstractLdapAuthenticationProvider authenticationProvider(LdapAuthorities
6369
6470 AbstractLdapAuthenticationProvider authProvider ;
6571
66- if (! props .isActiveDirectory ()) {
67- authProvider = new LdapAuthenticationProvider ( ba , authoritiesExtractor );
72+ if (props .isActiveDirectory ()) {
73+ authProvider = activeDirectoryProvider ( authoritiesExtractor );
6874 } else {
69- authProvider = new ActiveDirectoryLdapAuthenticationProvider (props .getActiveDirectoryDomain (),
70- props .getUrls ());
71- authProvider .setUseAuthenticationRequestCredentials (true );
72- ((ActiveDirectoryLdapAuthenticationProvider ) authProvider ).setAuthoritiesPopulator (authoritiesExtractor );
75+ authProvider = new LdapAuthenticationProvider (ba , authoritiesExtractor );
7376 }
7477
7578 if (rbacEnabled ) {
@@ -80,7 +83,7 @@ public AbstractLdapAuthenticationProvider authenticationProvider(LdapAuthorities
8083 }
8184
8285 @ Bean
83- @ ConditionalOnProperty (value = "oauth2.ldap.activeDirectory" , havingValue = "false" )
86+ @ ConditionalOnProperty (value = "oauth2.ldap.activeDirectory" , havingValue = "false" , matchIfMissing = true )
8487 public BindAuthenticator ldapBindAuthentication (LdapContextSource ldapContextSource ) {
8588 BindAuthenticator ba = new BindAuthenticator (ldapContextSource );
8689
@@ -159,6 +162,22 @@ public SecurityWebFilterChain configureLdap(ServerHttpSecurity http) {
159162 return builder .build ();
160163 }
161164
165+ private ActiveDirectoryLdapAuthenticationProvider activeDirectoryProvider (LdapAuthoritiesPopulator populator ) {
166+ ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider (
167+ props .getActiveDirectoryDomain (),
168+ props .getUrls ()
169+ );
170+
171+ provider .setUseAuthenticationRequestCredentials (true );
172+ provider .setAuthoritiesPopulator (populator );
173+
174+ if (Stream .of (props .getUrls ().split ("," )).anyMatch (url -> url .startsWith ("ldaps://" ))) {
175+ provider .setContextEnvironmentProperties (BASE_ENV_PROPS );
176+ }
177+
178+ return provider ;
179+ }
180+
162181 private static class RbacUserDetailsMapper extends LdapUserDetailsMapper {
163182 @ Override
164183 public UserDetails mapUserFromContext (DirContextOperations ctx , String username ,
0 commit comments