Skip to content

Commit

Permalink
adding support of logout for oidc auth module (MID-7488)
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Jan 3, 2022
1 parent 040b97a commit 29bc4a5
Show file tree
Hide file tree
Showing 27 changed files with 445 additions and 143 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ public interface ModuleWebSecurityConfiguration {

List<AuthenticationProvider> getAuthenticationProviders();

String getPrefixOfSequence();
String getSequenceSuffix();

void setPrefixOfSequence(String prefixOfSequence);
void setSequenceSuffix(String sequenceSuffix);

String getNameOfModule();

void setNameOfModule(String nameOfModule);

String getPrefix();
String getPrefixOfModule();

String getSpecificLoginUrl();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public abstract class AbstractCredentialModuleFactory<C extends ModuleWebSecurit

@Override
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType,
String prefixOfSequence, ServletRequest request, Map<Class<?>, Object> sharedObjects,
String sequenceSuffix, ServletRequest request, Map<Class<?>, Object> sharedObjects,
AuthenticationModulesType authenticationsPolicy, CredentialsPolicyType credentialPolicy,
AuthenticationChannel authenticationChannel) throws Exception {

Expand All @@ -51,7 +51,7 @@ public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType

isSupportedChannel(authenticationChannel);

C configuration = createConfiguration(moduleType, prefixOfSequence, authenticationChannel);
C configuration = createConfiguration(moduleType, sequenceSuffix, authenticationChannel);

configuration.addAuthenticationProvider(
getProvider((AbstractCredentialAuthenticationModuleType) moduleType, credentialPolicy));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public ObjectPostProcessor<Object> getObjectObjectPostProcessor() {

public abstract boolean match(AbstractAuthenticationModuleType moduleType);

public abstract AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String prefixOfSequence,
public abstract AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String sequenceSuffix,
ServletRequest request, Map<Class<?>, Object> sharedObjects,
AuthenticationModulesType authenticationsPolicy, CredentialsPolicyType credentialPolicy,
AuthenticationChannel authenticationChannel) throws Exception;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public boolean match(AbstractAuthenticationModuleType moduleType) {
@Override
protected ModuleWebSecurityConfiguration createConfiguration(AbstractAuthenticationModuleType moduleType, String prefixOfSequence, AuthenticationChannel authenticationChannel) {
ModuleWebSecurityConfigurationImpl configuration = ModuleWebSecurityConfigurationImpl.build(moduleType,prefixOfSequence);
configuration.setPrefixOfSequence(prefixOfSequence);
configuration.setSequenceSuffix(prefixOfSequence);
return configuration;
}

Expand All @@ -57,7 +57,7 @@ protected Class<? extends CredentialPolicyType> supportedClass() {
@Override
protected ModuleAuthenticationImpl createEmptyModuleAuthentication(AbstractAuthenticationModuleType moduleType, ModuleWebSecurityConfiguration configuration) {
HttpModuleAuthentication moduleAuthentication = new HttpModuleAuthentication(AuthenticationModuleNameConstants.HTTP_BASIC);
moduleAuthentication.setPrefix(configuration.getPrefix());
moduleAuthentication.setPrefix(configuration.getPrefixOfModule());
moduleAuthentication.setCredentialName(((AbstractPasswordAuthenticationModuleType)moduleType).getCredentialName());
moduleAuthentication.setCredentialType(supportedClass());
moduleAuthentication.setNameOfModule(configuration.getNameOfModule());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@ public boolean match(AbstractAuthenticationModuleType moduleType) {
}

@Override
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String prefixOfSequence,
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String sequenceSuffix,
ServletRequest request, Map<Class<?>, Object> sharedObjects,
AuthenticationModulesType authenticationsPolicy, CredentialsPolicyType credentialPolicy, AuthenticationChannel authenticationChannel) throws Exception {

ModuleWebSecurityConfiguration configuration = createConfiguration(moduleType, prefixOfSequence);
ModuleWebSecurityConfiguration configuration = createConfiguration(moduleType, sequenceSuffix);

configuration.addAuthenticationProvider(createProvider());

Expand All @@ -59,7 +59,7 @@ public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType

private ModuleWebSecurityConfiguration createConfiguration(AbstractAuthenticationModuleType moduleType, String prefixOfSequence) {
ModuleWebSecurityConfigurationImpl configuration = ModuleWebSecurityConfigurationImpl.build(moduleType,prefixOfSequence);
configuration.setPrefixOfSequence(prefixOfSequence);
configuration.setSequenceSuffix(prefixOfSequence);
return configuration;
}

Expand All @@ -73,7 +73,7 @@ private AuthenticationProvider createProvider() {

private ModuleAuthenticationImpl createEmptyModuleAuthentication(ModuleWebSecurityConfiguration configuration) {
ModuleAuthenticationImpl moduleAuthentication = new ModuleAuthenticationImpl(AuthenticationModuleNameConstants.CLUSTER);
moduleAuthentication.setPrefix(configuration.getPrefix());
moduleAuthentication.setPrefix(configuration.getPrefixOfModule());
moduleAuthentication.setNameOfModule(configuration.getNameOfModule());
return moduleAuthentication;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public boolean match(AbstractAuthenticationModuleType moduleType) {
}

@Override
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String prefixOfSequence, ServletRequest request,
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String sequenceSuffix, ServletRequest request,
Map<Class<?>, Object> sharedObjects, AuthenticationModulesType authenticationsPolicy, CredentialsPolicyType credentialPolicy, AuthenticationChannel authenticationChannel) throws Exception {
if (!(moduleType instanceof HttpHeaderAuthenticationModuleType)) {
LOGGER.error("This factory support only HttpHeaderAuthenticationModuleType, but modelType is " + moduleType);
Expand All @@ -54,7 +54,7 @@ public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType

isSupportedChannel(authenticationChannel);
HttpHeaderAuthenticationModuleType httpModuleType = (HttpHeaderAuthenticationModuleType) moduleType;
HttpHeaderModuleWebSecurityConfiguration configuration = HttpHeaderModuleWebSecurityConfiguration.build(httpModuleType, prefixOfSequence);
HttpHeaderModuleWebSecurityConfiguration configuration = HttpHeaderModuleWebSecurityConfiguration.build(httpModuleType, sequenceSuffix);
configuration.addAuthenticationProvider(getObjectObjectPostProcessor().postProcess(new PasswordProvider()));
HttpHeaderModuleWebSecurityConfigurer<HttpHeaderModuleWebSecurityConfiguration> module =
getObjectObjectPostProcessor().postProcess(new HttpHeaderModuleWebSecurityConfigurer<>(configuration));
Expand All @@ -69,7 +69,7 @@ public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType

private ModuleAuthenticationImpl createEmptyModuleAuthentication(ModuleWebSecurityConfigurationImpl configuration) {
HttpHeaderModuleAuthentication moduleAuthentication = new HttpHeaderModuleAuthentication();
moduleAuthentication.setPrefix(configuration.getPrefix());
moduleAuthentication.setPrefix(configuration.getPrefixOfModule());
moduleAuthentication.setNameOfModule(configuration.getNameOfModule());
return moduleAuthentication;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public boolean match(AbstractAuthenticationModuleType moduleType) {
@Override
protected ModuleWebSecurityConfiguration createConfiguration(AbstractAuthenticationModuleType moduleType, String prefixOfSequence, AuthenticationChannel authenticationChannel) {
ModuleWebSecurityConfigurationImpl configuration = ModuleWebSecurityConfigurationImpl.build(moduleType,prefixOfSequence);
configuration.setPrefixOfSequence(prefixOfSequence);
configuration.setSequenceSuffix(prefixOfSequence);
return configuration;
}

Expand All @@ -57,7 +57,7 @@ protected Class<? extends CredentialPolicyType> supportedClass() {
@Override
protected ModuleAuthenticationImpl createEmptyModuleAuthentication(AbstractAuthenticationModuleType moduleType, ModuleWebSecurityConfiguration configuration) {
HttpModuleAuthentication moduleAuthentication = new HttpModuleAuthentication(AuthenticationModuleNameConstants.SECURITY_QUESTIONS);
moduleAuthentication.setPrefix(configuration.getPrefix());
moduleAuthentication.setPrefix(configuration.getPrefixOfModule());
moduleAuthentication.setCredentialName(((AbstractCredentialAuthenticationModuleType)moduleType).getCredentialName());
moduleAuthentication.setCredentialType(supportedClass());
moduleAuthentication.setNameOfModule(configuration.getNameOfModule());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,11 @@

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
import org.springframework.security.ldap.authentication.BindAuthenticator;
import org.springframework.security.ldap.search.FilterBasedLdapUserSearch;
import org.springframework.security.ldap.userdetails.UserDetailsContextMapper;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.stereotype.Component;

Expand Down Expand Up @@ -63,7 +61,7 @@ public boolean match(AbstractAuthenticationModuleType moduleType) {
}

@Override
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String prefixOfSequence,
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String sequenceSuffix,
ServletRequest request, Map<Class<?>, Object> sharedObjects,
AuthenticationModulesType authenticationsPolicy, CredentialsPolicyType credentialPolicy, AuthenticationChannel authenticationChannel) throws Exception {

Expand All @@ -74,8 +72,8 @@ public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType

isSupportedChannel(authenticationChannel);

LdapModuleWebSecurityConfiguration configuration = LdapModuleWebSecurityConfiguration.build(moduleType, prefixOfSequence);
configuration.setPrefixOfSequence(prefixOfSequence);
LdapModuleWebSecurityConfiguration configuration = LdapModuleWebSecurityConfiguration.build(moduleType, sequenceSuffix);
configuration.setSequenceSuffix(sequenceSuffix);

configuration.addAuthenticationProvider(getProvider((LdapAuthenticationModuleType)moduleType));

Expand Down Expand Up @@ -128,7 +126,7 @@ private LdapWebSecurityConfigurer<LdapModuleWebSecurityConfiguration> createModu
protected ModuleAuthenticationImpl createEmptyModuleAuthentication(LdapAuthenticationModuleType moduleType,
ModuleWebSecurityConfiguration configuration) {
LdapModuleAuthentication moduleAuthentication = new LdapModuleAuthentication();
moduleAuthentication.setPrefix(configuration.getPrefix());
moduleAuthentication.setPrefix(configuration.getPrefixOfModule());
if (moduleType.getSearch() != null) {
moduleAuthentication.setNamingAttribute(moduleType.getSearch().getNamingAttr());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public boolean match(AbstractAuthenticationModuleType moduleType) {
@Override
protected LoginFormModuleWebSecurityConfiguration createConfiguration(AbstractAuthenticationModuleType moduleType, String prefixOfSequence, AuthenticationChannel authenticationChannel) {
LoginFormModuleWebSecurityConfiguration configuration = LoginFormModuleWebSecurityConfiguration.build(moduleType,prefixOfSequence);
configuration.setPrefixOfSequence(prefixOfSequence);
configuration.setSequenceSuffix(prefixOfSequence);
return configuration;
}

Expand All @@ -56,7 +56,7 @@ protected Class<? extends CredentialPolicyType> supportedClass() {
protected ModuleAuthenticationImpl createEmptyModuleAuthentication(AbstractAuthenticationModuleType moduleType,
LoginFormModuleWebSecurityConfiguration configuration) {
LoginFormModuleAuthenticationImpl moduleAuthentication = new LoginFormModuleAuthenticationImpl();
moduleAuthentication.setPrefix(configuration.getPrefix());
moduleAuthentication.setPrefix(configuration.getPrefixOfModule());
moduleAuthentication.setCredentialName(((AbstractCredentialAuthenticationModuleType)moduleType).getCredentialName());
moduleAuthentication.setCredentialType(supportedClass());
moduleAuthentication.setNameOfModule(configuration.getNameOfModule());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public boolean match(AbstractAuthenticationModuleType moduleType) {
@Override
protected ModuleWebSecurityConfiguration createConfiguration(AbstractAuthenticationModuleType moduleType, String prefixOfSequence, AuthenticationChannel authenticationChannel) {
ModuleWebSecurityConfigurationImpl configuration = ModuleWebSecurityConfigurationImpl.build(moduleType,prefixOfSequence);
configuration.setPrefixOfSequence(prefixOfSequence);
configuration.setSequenceSuffix(prefixOfSequence);
configuration.setSpecificLoginUrl(authenticationChannel.getSpecificLoginUrl());
return configuration;
}
Expand All @@ -59,7 +59,7 @@ protected Class<? extends CredentialPolicyType> supportedClass() {
protected ModuleAuthenticationImpl createEmptyModuleAuthentication(AbstractAuthenticationModuleType moduleType,
ModuleWebSecurityConfiguration configuration) {
MailNonceModuleAuthenticationImpl moduleAuthentication = new MailNonceModuleAuthenticationImpl();
moduleAuthentication.setPrefix(configuration.getPrefix());
moduleAuthentication.setPrefix(configuration.getPrefixOfModule());
moduleAuthentication.setCredentialName(((AbstractCredentialAuthenticationModuleType)moduleType).getCredentialName());
moduleAuthentication.setCredentialType(supportedClass());
moduleAuthentication.setNameOfModule(configuration.getNameOfModule());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public boolean match(AbstractAuthenticationModuleType moduleType) {
}

@Override
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String prefixOfSequence, ServletRequest request,
public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType, String sequenceSuffix, ServletRequest request,
Map<Class<?>, Object> sharedObjects, AuthenticationModulesType authenticationsPolicy, CredentialsPolicyType credentialPolicy, AuthenticationChannel authenticationChannel) throws Exception {
if (!(moduleType instanceof OidcAuthenticationModuleType)) {
LOGGER.error("This factory support only OidcAuthenticationModuleType, but modelType is " + moduleType);
Expand All @@ -53,8 +53,8 @@ public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType

OidcModuleWebSecurityConfiguration.setProtector(getProtector());
OidcModuleWebSecurityConfiguration configuration = OidcModuleWebSecurityConfiguration.build(
(OidcAuthenticationModuleType)moduleType, prefixOfSequence, getPublicUrlPrefix(request), request);
configuration.setPrefixOfSequence(prefixOfSequence);
(OidcAuthenticationModuleType)moduleType, sequenceSuffix, getPublicUrlPrefix(request), request);
configuration.setSequenceSuffix(sequenceSuffix);
configuration.addAuthenticationProvider(getObjectObjectPostProcessor().postProcess(new OidcProvider()));

OidcModuleWebSecurityConfigurer<OidcModuleWebSecurityConfiguration> module = getObjectObjectPostProcessor().postProcess(
Expand All @@ -74,7 +74,7 @@ public ModuleAuthenticationImpl createEmptyModuleAuthentication(OidcModuleWebSec
List<IdentityProvider> providers = new ArrayList<>();
configuration.getClientRegistrationRepository().forEach(
client -> {
String authRequestPrefixUrl = "/midpoint" + configuration.getPrefix() + OidcModuleAuthenticationImpl.AUTHORIZATION_REQUEST_PROCESSING_URL_SUFFIX_WITH_REG_ID;
String authRequestPrefixUrl = "/midpoint" + configuration.getPrefixOfModule() + OidcModuleAuthenticationImpl.AUTHORIZATION_REQUEST_PROCESSING_URL_SUFFIX_WITH_REG_ID;
IdentityProvider mp = new IdentityProvider()
.setLinkText(client.getProviderDetails().getUserInfoEndpoint().getUserNameAttributeName())
.setRedirectLink(authRequestPrefixUrl.replace("{registrationId}", client.getRegistrationId()));
Expand All @@ -84,7 +84,7 @@ public ModuleAuthenticationImpl createEmptyModuleAuthentication(OidcModuleWebSec
moduleAuthentication.setClientsRepository(configuration.getClientRegistrationRepository());
moduleAuthentication.setProviders(providers);
moduleAuthentication.setNameOfModule(configuration.getNameOfModule());
moduleAuthentication.setPrefix(configuration.getPrefix());
moduleAuthentication.setPrefix(configuration.getPrefixOfModule());
return moduleAuthentication;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public boolean match(AbstractAuthenticationModuleType module) {
}

@Override
public AuthModule createModuleFilter(AbstractAuthenticationModuleType module, String prefixOfSequence, ServletRequest request,
public AuthModule createModuleFilter(AbstractAuthenticationModuleType module, String sequenceSuffix, ServletRequest request,
Map<Class<?>, Object> sharedObjects, AuthenticationModulesType authenticationsPolicy,
CredentialsPolicyType credentialPolicy, AuthenticationChannel authenticationChannel) throws Exception {

Expand All @@ -53,7 +53,7 @@ public AuthModule createModuleFilter(AbstractAuthenticationModuleType module, St
Class<AbstractModuleFactory> factoryClazz = (Class) Class.forName(factoryClass);
AbstractModuleFactory factory = applicationContext.getBean(factoryClazz);

return factory.createModuleFilter(module, prefixOfSequence, request, sharedObjects,
return factory.createModuleFilter(module, sequenceSuffix, request, sharedObjects,
authenticationsPolicy, credentialPolicy, authenticationChannel);
}
}

0 comments on commit 29bc4a5

Please sign in to comment.