Skip to content

Commit 568bb96

Browse files
committed
Implement pre-flow-init action to prepare server-specific settings
OSF server-specific settings such as OSF URLs need to be configured at the very beginning of the login flow so that ThymeLeaf templates can be rendered correctly across the flow state machine. Previously, it was configured at the start of the non-interactive action where any rendering attempt before it would fail with empty pages rendered. This is fixed now by overriding the login flow init process. A pre-init action with what we did in the non-interactive action before is injected onto the top of the start action list.
1 parent 4f1c07b commit 568bb96

5 files changed

Lines changed: 60 additions & 10 deletions

File tree

src/main/java/io/cos/cas/osf/web/config/OsfCasSupportActionsConfiguration.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.cos.cas.osf.dao.JpaOsfDao;
44
import io.cos.cas.osf.web.flow.login.OsfDefaultLoginPreparationAction;
55
import io.cos.cas.osf.web.flow.login.OsfInstitutionLoginPreparationAction;
6+
import io.cos.cas.osf.web.flow.login.OsfCasPreInitialFlowSetupAction;
67
import io.cos.cas.osf.web.flow.login.OsfPrincipalFromNonInteractiveCredentialsAction;
78

89
import org.apereo.cas.CentralAuthenticationService;
@@ -22,7 +23,6 @@
2223
import org.springframework.webflow.execution.Action;
2324

2425
import java.util.LinkedHashMap;
25-
import java.util.LinkedList;
2626
import java.util.List;
2727
import java.util.Map;
2828

@@ -48,7 +48,6 @@ public class OsfCasSupportActionsConfiguration extends CasSupportActionsConfigur
4848
@Qualifier("initialAuthenticationAttemptWebflowEventResolver")
4949
private ObjectProvider<CasDelegatingWebflowEventResolver> initialAuthenticationAttemptWebflowEventResolver;
5050

51-
5251
@Autowired
5352
@Qualifier("adaptiveAuthenticationPolicy")
5453
private ObjectProvider<AdaptiveAuthenticationPolicy> adaptiveAuthenticationPolicy;
@@ -60,6 +59,16 @@ public class OsfCasSupportActionsConfiguration extends CasSupportActionsConfigur
6059
@Autowired
6160
private ObjectProvider<JpaOsfDao> jpaOsfDao;
6261

62+
/**
63+
* Bean configuration for {@link OsfCasPreInitialFlowSetupAction}.
64+
*
65+
* @return the initialized action
66+
*/
67+
@Bean
68+
public Action osfCasPreInitialFlowSetupAction() {
69+
return new OsfCasPreInitialFlowSetupAction(casProperties.getAuthn().getOsfUrl());
70+
}
71+
6372
/**
6473
* Bean configuration for {@link OsfPrincipalFromNonInteractiveCredentialsAction}.
6574
*

src/main/java/io/cos/cas/osf/web/flow/configurer/OsfCasLoginWebflowConfigurer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.context.ConfigurableApplicationContext;
2727
import org.springframework.webflow.core.collection.MutableAttributeMap;
2828
import org.springframework.webflow.definition.registry.FlowDefinitionRegistry;
29+
import org.springframework.webflow.engine.ActionList;
2930
import org.springframework.webflow.engine.ActionState;
3031
import org.springframework.webflow.engine.Flow;
3132
import org.springframework.webflow.engine.History;
@@ -66,6 +67,13 @@ public OsfCasLoginWebflowConfigurer(
6667
super(flowBuilderServices, flowDefinitionRegistry, applicationContext, casProperties);
6768
}
6869

70+
@Override
71+
protected void createInitialFlowActions(final Flow flow) {
72+
final ActionList startActionList = flow.getStartActionList();
73+
startActionList.add(createEvaluateAction(OsfCasWebflowConstants.ACTION_ID_OSF_PRE_INITIAL_FLOW_SETUP));
74+
super.createInitialFlowActions(flow);
75+
}
76+
6977
@Override
7078
protected void createDefaultViewStates(final Flow flow) {
7179
super.createDefaultViewStates(flow);
@@ -438,5 +446,4 @@ protected void createInstitutionLoginView(final Flow flow) {
438446
OsfCasWebflowConstants.VIEW_ID_INSTITUTION_SSO_INIT
439447
);
440448
}
441-
442449
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.cos.cas.osf.web.flow.login;
2+
3+
import io.cos.cas.osf.configuration.model.OsfUrlProperties;
4+
5+
import lombok.RequiredArgsConstructor;
6+
import lombok.extern.slf4j.Slf4j;
7+
8+
import org.springframework.webflow.action.AbstractAction;
9+
import org.springframework.webflow.execution.Event;
10+
import org.springframework.webflow.execution.RequestContext;
11+
12+
import javax.validation.constraints.NotNull;
13+
import java.util.Optional;
14+
15+
/**
16+
* This is {@link OsfCasPreInitialFlowSetupAction}.
17+
*
18+
* @author Longze Chen
19+
* @since 20.2.0
20+
*/
21+
@RequiredArgsConstructor
22+
@Slf4j
23+
public class OsfCasPreInitialFlowSetupAction extends AbstractAction {
24+
25+
private static final String OSF_URL_FLOW_PARAMETER = "osfUrl";
26+
27+
@NotNull
28+
private final OsfUrlProperties osfUrlProperties;
29+
30+
@Override
31+
protected Event doExecute(final RequestContext context) {
32+
OsfUrlProperties osfUrl = Optional.of(context).map(requestContext
33+
-> (OsfUrlProperties) requestContext.getFlowScope().get(OSF_URL_FLOW_PARAMETER)).orElse(null);
34+
if (osfUrl == null) {
35+
context.getFlowScope().put(OSF_URL_FLOW_PARAMETER, osfUrlProperties);
36+
}
37+
return success();
38+
}
39+
}

src/main/java/io/cos/cas/osf/web/flow/login/OsfPrincipalFromNonInteractiveCredentialsAction.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@
8080
import java.util.Date;
8181
import java.util.List;
8282
import java.util.Map;
83-
import java.util.Optional;
8483

8584
/**
8685
* This is {@link OsfPrincipalFromNonInteractiveCredentialsAction}.
@@ -265,12 +264,6 @@ protected Credential constructCredentialsFromRequest(final RequestContext contex
265264

266265
@Override
267266
protected Event doPreExecute(final RequestContext context) throws Exception {
268-
// Put server-specific OSF URLs into the flow scope
269-
OsfUrlProperties osfUrl = Optional.of(context).map(requestContext
270-
-> (OsfUrlProperties) requestContext.getFlowScope().get(OSF_URL_FLOW_PARAMETER)).orElse(null);
271-
if (osfUrl == null) {
272-
context.getFlowScope().put(OSF_URL_FLOW_PARAMETER, osfUrlProperties);
273-
}
274267
// super.doPreExecute() calls constructCredentialsFromRequest() whose exception must be caught and returned as a flow event
275268
try {
276269
return super.doPreExecute(context);

src/main/java/io/cos/cas/osf/web/flow/support/OsfCasWebflowConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
public interface OsfCasWebflowConstants {
1212

13+
String ACTION_ID_OSF_PRE_INITIAL_FLOW_SETUP = "osfCasPreInitialFlowSetupAction";
14+
1315
String ACTION_ID_OSF_DEFAULT_LOGIN_CHECK = "osfDefaultLoginCheckAction";
1416

1517
String STATE_ID_OSF_DEFAULT_LOGIN_CHECK = "osfDefaultLoginCheck";

0 commit comments

Comments
 (0)