mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-06-22 07:25:04 +00:00
ldap testing
This commit is contained in:
parent
f5eacceaab
commit
27604247ec
@ -397,6 +397,9 @@ dependencies {
|
|||||||
|
|
||||||
if (System.getenv("DOCKER_ENABLE_SECURITY") != "false") {
|
if (System.getenv("DOCKER_ENABLE_SECURITY") != "false") {
|
||||||
|
|
||||||
|
implementation 'org.springframework.security:spring-security-ldap'
|
||||||
|
implementation 'org.springframework.ldap:spring-ldap-core'
|
||||||
|
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-actuator'
|
implementation 'org.springframework.boot:spring-boot-starter-actuator'
|
||||||
implementation 'io.micrometer:micrometer-registry-prometheus'
|
implementation 'io.micrometer:micrometer-registry-prometheus'
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ public class EEAppConfig {
|
|||||||
return applicationProperties.getPremium().getProFeatures().isSsoAutoLogin();
|
return applicationProperties.getPremium().getProFeatures().isSsoAutoLogin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: Remove post migration
|
// TODO: Remove post migration
|
||||||
public void migrateEnterpriseSettingsToPremium(ApplicationProperties applicationProperties) {
|
public void migrateEnterpriseSettingsToPremium(ApplicationProperties applicationProperties) {
|
||||||
EnterpriseEdition enterpriseEdition = applicationProperties.getEnterpriseEdition();
|
EnterpriseEdition enterpriseEdition = applicationProperties.getEnterpriseEdition();
|
||||||
|
@ -8,6 +8,7 @@ import org.springframework.context.annotation.Bean;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.DependsOn;
|
import org.springframework.context.annotation.DependsOn;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.security.authentication.AuthenticationProvider;
|
||||||
import org.springframework.security.authentication.ProviderManager;
|
import org.springframework.security.authentication.ProviderManager;
|
||||||
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
|
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
|
||||||
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
|
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
|
||||||
@ -63,6 +64,7 @@ public class SecurityConfiguration {
|
|||||||
private final GrantedAuthoritiesMapper oAuth2userAuthoritiesMapper;
|
private final GrantedAuthoritiesMapper oAuth2userAuthoritiesMapper;
|
||||||
private final RelyingPartyRegistrationRepository saml2RelyingPartyRegistrations;
|
private final RelyingPartyRegistrationRepository saml2RelyingPartyRegistrations;
|
||||||
private final OpenSaml4AuthenticationRequestResolver saml2AuthenticationRequestResolver;
|
private final OpenSaml4AuthenticationRequestResolver saml2AuthenticationRequestResolver;
|
||||||
|
private final AuthenticationProvider ldapAuthenticationProvider;
|
||||||
|
|
||||||
public SecurityConfiguration(
|
public SecurityConfiguration(
|
||||||
PersistentLoginRepository persistentLoginRepository,
|
PersistentLoginRepository persistentLoginRepository,
|
||||||
@ -79,7 +81,7 @@ public class SecurityConfiguration {
|
|||||||
@Autowired(required = false)
|
@Autowired(required = false)
|
||||||
RelyingPartyRegistrationRepository saml2RelyingPartyRegistrations,
|
RelyingPartyRegistrationRepository saml2RelyingPartyRegistrations,
|
||||||
@Autowired(required = false)
|
@Autowired(required = false)
|
||||||
OpenSaml4AuthenticationRequestResolver saml2AuthenticationRequestResolver) {
|
OpenSaml4AuthenticationRequestResolver saml2AuthenticationRequestResolver, @Autowired(required = false) AuthenticationProvider ldapAuthenticationProvider) {
|
||||||
this.userDetailsService = userDetailsService;
|
this.userDetailsService = userDetailsService;
|
||||||
this.userService = userService;
|
this.userService = userService;
|
||||||
this.loginEnabledValue = loginEnabledValue;
|
this.loginEnabledValue = loginEnabledValue;
|
||||||
@ -93,6 +95,7 @@ public class SecurityConfiguration {
|
|||||||
this.oAuth2userAuthoritiesMapper = oAuth2userAuthoritiesMapper;
|
this.oAuth2userAuthoritiesMapper = oAuth2userAuthoritiesMapper;
|
||||||
this.saml2RelyingPartyRegistrations = saml2RelyingPartyRegistrations;
|
this.saml2RelyingPartyRegistrations = saml2RelyingPartyRegistrations;
|
||||||
this.saml2AuthenticationRequestResolver = saml2AuthenticationRequestResolver;
|
this.saml2AuthenticationRequestResolver = saml2AuthenticationRequestResolver;
|
||||||
|
this.ldapAuthenticationProvider = ldapAuthenticationProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@ -284,10 +287,20 @@ public class SecurityConfiguration {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
log.debug("SAML 2 login is not enabled. Using default.");
|
log.debug("SAML 2 login is not enabled. Using default.");
|
||||||
http.authorizeHttpRequests(authz -> authz.anyRequest().permitAll());
|
http.authorizeHttpRequests(authz -> authz.anyRequest().permitAll());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (applicationProperties.getSecurity().getLdap().getEnabled()) {
|
||||||
|
if (ldapAuthenticationProvider != null) {
|
||||||
|
http.authenticationProvider(ldapAuthenticationProvider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return http.build();
|
return http.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,86 @@
|
|||||||
|
package stirling.software.SPDF.config.security.ldap;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.ldap.core.support.LdapContextSource;
|
||||||
|
import org.springframework.security.authentication.AuthenticationProvider;
|
||||||
|
import org.springframework.security.ldap.authentication.BindAuthenticator;
|
||||||
|
import org.springframework.security.ldap.authentication.LdapAuthenticationProvider;
|
||||||
|
import org.springframework.security.ldap.authentication.LdapAuthenticator;
|
||||||
|
import org.springframework.security.ldap.search.FilterBasedLdapUserSearch;
|
||||||
|
import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;
|
||||||
|
import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;
|
||||||
|
|
||||||
|
import stirling.software.SPDF.model.ApplicationProperties;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ConditionalOnProperty(name = "security.ldap.enabled", havingValue = "true")
|
||||||
|
public class LDAPConfiguration {
|
||||||
|
|
||||||
|
private final ApplicationProperties applicationProperties;
|
||||||
|
|
||||||
|
public LDAPConfiguration(ApplicationProperties applicationProperties) {
|
||||||
|
this.applicationProperties = applicationProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public LdapContextSource ldapContextSource() {
|
||||||
|
LdapContextSource contextSource = new LdapContextSource();
|
||||||
|
contextSource.setUrl(applicationProperties.getSecurity().getLdap().getUrl());
|
||||||
|
contextSource.setBase(applicationProperties.getSecurity().getLdap().getBaseDn());
|
||||||
|
|
||||||
|
String managerDn = applicationProperties.getSecurity().getLdap().getManagerDn();
|
||||||
|
String managerPassword = applicationProperties.getSecurity().getLdap().getManagerPassword();
|
||||||
|
|
||||||
|
if (managerDn != null && !managerDn.isEmpty() && managerPassword != null) {
|
||||||
|
contextSource.setUserDn(managerDn);
|
||||||
|
contextSource.setPassword(managerPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
contextSource.afterPropertiesSet();
|
||||||
|
return contextSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public LdapAuthoritiesPopulator ldapAuthoritiesPopulator(LdapContextSource contextSource) {
|
||||||
|
DefaultLdapAuthoritiesPopulator authoritiesPopulator = new DefaultLdapAuthoritiesPopulator(
|
||||||
|
contextSource,
|
||||||
|
applicationProperties.getSecurity().getLdap().getGroupSearchBase()
|
||||||
|
);
|
||||||
|
authoritiesPopulator.setGroupSearchFilter(applicationProperties.getSecurity().getLdap().getGroupSearchFilter());
|
||||||
|
authoritiesPopulator.setRolePrefix("ROLE_");
|
||||||
|
return authoritiesPopulator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public LdapAuthenticator ldapAuthenticator(LdapContextSource contextSource) {
|
||||||
|
BindAuthenticator authenticator = new BindAuthenticator(contextSource);
|
||||||
|
String userDnPattern = applicationProperties.getSecurity().getLdap().getUserDnPattern();
|
||||||
|
|
||||||
|
if (userDnPattern != null && !userDnPattern.isEmpty()) {
|
||||||
|
authenticator.setUserDnPatterns(new String[]{userDnPattern});
|
||||||
|
} else {
|
||||||
|
String userSearchBase = applicationProperties.getSecurity().getLdap().getUserSearchBase();
|
||||||
|
String userSearchFilter = applicationProperties.getSecurity().getLdap().getUserSearchFilter();
|
||||||
|
if (userSearchBase != null && userSearchFilter != null) {
|
||||||
|
FilterBasedLdapUserSearch userSearch = new FilterBasedLdapUserSearch(
|
||||||
|
userSearchBase,
|
||||||
|
userSearchFilter,
|
||||||
|
contextSource
|
||||||
|
);
|
||||||
|
authenticator.setUserSearch(userSearch);
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException("LDAP configuration requires either userDnPattern or userSearchBase and userSearchFilter.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return authenticator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public AuthenticationProvider ldapAuthenticationProvider(
|
||||||
|
LdapAuthenticator authenticator,
|
||||||
|
LdapAuthoritiesPopulator authoritiesPopulator) {
|
||||||
|
return new LdapAuthenticationProvider(authenticator, authoritiesPopulator);
|
||||||
|
}
|
||||||
|
}
|
@ -122,7 +122,8 @@ public class OtherWebController {
|
|||||||
return Arrays.stream(files)
|
return Arrays.stream(files)
|
||||||
.filter(file -> file.getName().endsWith(".traineddata"))
|
.filter(file -> file.getName().endsWith(".traineddata"))
|
||||||
.map(file -> file.getName().replace(".traineddata", ""))
|
.map(file -> file.getName().replace(".traineddata", ""))
|
||||||
.filter(lang -> !lang.equalsIgnoreCase("osd")).sorted()
|
.filter(lang -> !lang.equalsIgnoreCase("osd"))
|
||||||
|
.sorted()
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +108,7 @@ public class ApplicationProperties {
|
|||||||
private InitialLogin initialLogin = new InitialLogin();
|
private InitialLogin initialLogin = new InitialLogin();
|
||||||
private OAUTH2 oauth2 = new OAUTH2();
|
private OAUTH2 oauth2 = new OAUTH2();
|
||||||
private SAML2 saml2 = new SAML2();
|
private SAML2 saml2 = new SAML2();
|
||||||
|
private LDAP ldap = new LDAP();
|
||||||
private int loginAttemptCount;
|
private int loginAttemptCount;
|
||||||
private long loginResetTimeMinutes;
|
private long loginResetTimeMinutes;
|
||||||
private String loginMethod = "all";
|
private String loginMethod = "all";
|
||||||
@ -218,6 +219,25 @@ public class ApplicationProperties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@ToString
|
||||||
|
public static class LDAP {
|
||||||
|
private Boolean enabled = false;
|
||||||
|
private String url;
|
||||||
|
private String baseDn;
|
||||||
|
private String userDnPattern;
|
||||||
|
private String groupSearchBase;
|
||||||
|
private String managerDn;
|
||||||
|
@ToString.Exclude private String managerPassword;
|
||||||
|
|
||||||
|
public boolean isSettingsValid() {
|
||||||
|
return enabled
|
||||||
|
&& !isStringEmpty(url)
|
||||||
|
&& !isStringEmpty(baseDn)
|
||||||
|
&& !isStringEmpty(userDnPattern);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public static class OAUTH2 {
|
public static class OAUTH2 {
|
||||||
private Boolean enabled = false;
|
private Boolean enabled = false;
|
||||||
|
@ -60,7 +60,14 @@ security:
|
|||||||
idpCert: classpath:okta.cert # The certificate your Provider will use to authenticate your app's SAML authentication requests. Provided by your Provider
|
idpCert: classpath:okta.cert # The certificate your Provider will use to authenticate your app's SAML authentication requests. Provided by your Provider
|
||||||
privateKey: classpath:saml-private-key.key # Your private key. Generated from your keypair
|
privateKey: classpath:saml-private-key.key # Your private key. Generated from your keypair
|
||||||
spCert: classpath:saml-public-cert.crt # Your signing certificate. Generated from your keypair
|
spCert: classpath:saml-public-cert.crt # Your signing certificate. Generated from your keypair
|
||||||
|
ldap:
|
||||||
|
enabled: true
|
||||||
|
url: ldap://your-ldap-server:389
|
||||||
|
base-dn: dc=example,dc=com
|
||||||
|
user-dn-pattern: uid={0},ou=people
|
||||||
|
group-search-base: ou=groups
|
||||||
|
manager-dn: cn=admin,dc=example,dc=com # If needed
|
||||||
|
manager-password: admin-password # If needed
|
||||||
|
|
||||||
premium:
|
premium:
|
||||||
key: 00000000-0000-0000-0000-000000000000
|
key: 00000000-0000-0000-0000-000000000000
|
||||||
@ -70,8 +77,9 @@ premium:
|
|||||||
CustomMetadata:
|
CustomMetadata:
|
||||||
autoUpdateMetadata: false
|
autoUpdateMetadata: false
|
||||||
author: username
|
author: username
|
||||||
creator: Stirling-PDF
|
creator: Team1
|
||||||
producer: Stirling-PDF
|
producer:
|
||||||
|
|
||||||
|
|
||||||
legal:
|
legal:
|
||||||
termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder
|
termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder
|
||||||
|
Loading…
x
Reference in New Issue
Block a user