[KEYCLOAK-12253] Fix conditional authenticators are evaluated even if they are disabled (#6553)
This commit is contained in:
parent
27b410e772
commit
129c689855
2 changed files with 32 additions and 0 deletions
|
@ -352,6 +352,7 @@ public class DefaultAuthenticationFlow implements AuthenticationFlow {
|
||||||
List<AuthenticationExecutionModel> modelList = processor.getRealm().getAuthenticationExecutions(model.getFlowId());
|
List<AuthenticationExecutionModel> modelList = processor.getRealm().getAuthenticationExecutions(model.getFlowId());
|
||||||
List<AuthenticationExecutionModel> conditionalAuthenticatorList = modelList.stream()
|
List<AuthenticationExecutionModel> conditionalAuthenticatorList = modelList.stream()
|
||||||
.filter(this::isConditionalAuthenticator)
|
.filter(this::isConditionalAuthenticator)
|
||||||
|
.filter(s -> s.isEnabled())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
return conditionalAuthenticatorList.isEmpty() || conditionalAuthenticatorList.stream().anyMatch(m-> conditionalNotMatched(m, modelList));
|
return conditionalAuthenticatorList.isEmpty() || conditionalAuthenticatorList.stream().anyMatch(m-> conditionalNotMatched(m, modelList));
|
||||||
}
|
}
|
||||||
|
|
|
@ -363,6 +363,37 @@ public class BrowserFlowTest extends AbstractTestRealmKeycloakTest {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A conditional flow with disabled conditional authenticator should automatically be disabled
|
||||||
|
@Test
|
||||||
|
public void testFlowDisabledWhenConditionalAuthenticatorIsDisabled() {
|
||||||
|
try {
|
||||||
|
configureBrowserFlowWithConditionalSubFlowHavingDisabledConditionalAuthenticator("browser - disabled conditional authenticator");
|
||||||
|
// Flow is conditional but it is missing a conditional authentication executor
|
||||||
|
// The whole flow is disabled
|
||||||
|
Assert.assertFalse(needsPassword("user-with-two-configured-otp"));
|
||||||
|
} finally {
|
||||||
|
revertFlows("browser - disabled conditional authenticator");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureBrowserFlowWithConditionalSubFlowHavingDisabledConditionalAuthenticator(String newFlowAlias) {
|
||||||
|
testingClient.server("test").run(session -> FlowUtil.inCurrentRealm(session).copyBrowserFlow(newFlowAlias));
|
||||||
|
testingClient.server("test").run(session -> FlowUtil.inCurrentRealm(session)
|
||||||
|
.selectFlow(newFlowAlias)
|
||||||
|
.inForms(forms -> forms
|
||||||
|
.clear()
|
||||||
|
.addAuthenticatorExecution(Requirement.REQUIRED, UsernameFormFactory.PROVIDER_ID)
|
||||||
|
.addSubFlowExecution(Requirement.CONDITIONAL, subFlow -> {
|
||||||
|
// Add authenticators to this flow: 1 conditional authenticator and a basic authenticator executions
|
||||||
|
subFlow.addAuthenticatorExecution(Requirement.DISABLED, ConditionalUserConfiguredAuthenticatorFactory.PROVIDER_ID);
|
||||||
|
|
||||||
|
// Update the browser forms only with a UsernameForm
|
||||||
|
subFlow.addAuthenticatorExecution(Requirement.REQUIRED, PasswordFormFactory.PROVIDER_ID);
|
||||||
|
}))
|
||||||
|
.defineAsBrowserFlow()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Configure a conditional authenticator in a non-conditional sub-flow
|
// Configure a conditional authenticator in a non-conditional sub-flow
|
||||||
// In such case, the flow is evaluated and the conditional authenticator is considered as disabled
|
// In such case, the flow is evaluated and the conditional authenticator is considered as disabled
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in a new issue