在 cas 中将模型数据注入 spring webflow

inject model data into spring webflow in cas

我正在将 CAS 4 升级到 CAS 6。我已经完成了几个 Spring Boot 2 应用程序,所以我知道我在那里做什么。我什至可以做一些 webflow,但只能从头开始。

文档明确指出不要弄乱基本网络流程 xml,并 "inject" 您自己的服务。

如何"inject"服务?我真的只需要将当天的消息添加到登录页面。

有人有这么简单的例子吗?

在下面找到我的方法,在 cas-maven-overlay 安装上测试,cas 版本为 5.3.x。 cas 6 分支上的某些事情可能有所不同,但我认为主要思想仍然存在。

首先,我们应该创建一个 Action class,它将被注入到登录流程中,并将在流程范围内添加所需的消息,以便在模板(视图)中可用。

public class DailyMessageAction extends AbstractAction{
    @Override
    protected Event doExecute(RequestContext context) throws Exception {
        context.getFlowScope().asMap().put("dailyMessage", "YOUR_AWESOME_MESSAGE");
        return success();
    }       
}

然后创建一个WebflowConfigurer class并在动作列表中注入我们新创建的DailyMessageAction(见doInitialize方法)。

public class DailyMessageWebflowConfigurer extends AbstractCasWebflowConfigurer{
    final Action dailyMessageAction;

    public DailyMessageWebflowConfigurer(FlowBuilderServices flowBuilderServices,
                               FlowDefinitionRegistry flowDefinitionRegistry,
                               ApplicationContext applicationContext,
                               CasConfigurationProperties casProperties,Action dailyMessageAction){
        super(flowBuilderServices, flowDefinitionRegistry, applicationContext, casProperties);
        this.dailyMessageAction = dailyMessageAction;
    }

    @Override
    protected void doInitialize() {
        final Flow flow = super.getLoginFlow();
        flow.getStartActionList().add(dailyMessageAction);
    }
}

之后我们应该在cas运行时注入DailyMessageWebflowConfigurer。这是通过创建配置 class 并注入我们的配置器来实现的。

@Configuration
public class CustomWebflowConfiguration {

@Autowired
private CasConfigurationProperties casProperties;

@Autowired
@Qualifier("loginFlowRegistry")
private FlowDefinitionRegistry loginFlowDefinitionRegistry;

@Autowired
private ApplicationContext applicationContext;

@Autowired
private FlowBuilderServices flowBuilderServices; 
    @RefreshScope
    @ConditionalOnMissingBean(name = "dailyMessageAction")
    @Bean
    public Action dailyMessageAction(){
        return new DailyMessageAction();
    }

    @ConditionalOnMissingBean(name = "dailyMessageWebflowConfigurer")
    @Bean
    @RefreshScope
    public CasWebflowConfigurer dailyMessageWebflowConfigurer(){
        final DailyMessageWebflowConfigurer w = new DailyMessageWebflowConfigurer(flowBuilderServices,
                loginFlowDefinitionRegistry,
                applicationContext,
                casProperties, 
                dailyMessageAction());
        w.initialize();
        return w;
    }
}

将我们的CustomWebflowConfigurationclass包含在META-INF/spring.factories中:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=your_package.CustomWebflowConfiguration

最后一步是在视图中显示添加的消息。通过添加这一行来实现

<div th:utext="${dailyMessage}"></div>

templates/casLoginView.html 文件中。

... add a message of the day to the login page...

不建议在 CAS 中直接修改 spring webflow。 read this for more info

所以如果我是你而不是修补 spring webflow,我会尝试做如下的事情:

注:

  • 请记住,这可能不是推荐的方法,但我认为这会起作用,而且比重写 spring webflow
  • 工作少得多
  • 正如你说的你对Spring boot很熟悉,所以我不会在细节实现上烦你,如果你/其他reader感到困惑,我可以跟进
  • 如果您的当天消息可以硬编码,则跳过 1-3 直接进入 4。

好的,我们开始:

  1. 覆盖 CasSupportActionsConfiguration,仅添加 initialFlowSetupAction bean

  2. 添加自定义 class(我们将其命名为 MyInitialFlowSetupAction)并实施 InitialFlowSetupAction

  3. MyInitialFlowSetupAction中添加如下内容:


    @Override
    public Event doExecute(final RequestContext context) {
        Event returnEvent = super.doExecute(context);
        configureMyAwesomeMessageOfTheDay(context) 
        return returnEvent;
    }



    private void configureMyAwesomeMessageOfTheDay(final RequestContext context) {
         String messageOfTheDay = "Spring is the best season!";//Your logic here
         context.getFlowScope().put("MESSAGE_OF_THE_DAY", messageOfTheDay);
    }

4。 CAS 6 使用 WAR 覆盖,因此您可以覆盖 html 文件,包括这个

https://github.com/apereo/cas/blob/v6.0.3/webapp/resources/templates/casLoginView.html

覆盖该文件,并将您的 MESSAGE_OF_THE_DAY 添加到其中

<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout}">
... 

<body class="login">
<main role="main" class="container mt-3 mb-3">
Message of the day is: ${MESSAGE_OF_THE_DAY}
...
</main>
</body>
</html>

看看这是否对你有帮助