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

时间:2019-04-24 02:39:38

标签: cas spring-webflow

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

该文档明确指出不要弄乱基本的webflow xml,并“注入”您自己的服务。

一个人如何“注入”服务?我真的只需要在登录页面中添加当天的消息。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

然后创建一个WebflowConfigurer类,并将我们新创建的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 runtime中注入DailyMessageWebflowConfigurer。这是通过创建配置类并注入我们的配置器来实现的。

@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;
    }
}

CustomWebflowConfiguration中加入我们的META-INF/spring.factories类:

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

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

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

templates/casLoginView.html文件中。

答案 1 :(得分:1)

  

...将当天的消息添加到登录页面...

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

因此,如果我不是您而不是热衷于Spring Webflow,我将尝试执行以下操作:

注意:

  • 请记住,这可能不是推荐的方法,但我认为这是可行的,并且比覆盖spring webflow少得多的工作
  • 正如您所说的,您对Spring引导非常熟悉,所以我不会对详细的实现感到无聊,如果您/其他读者感到困惑,我可以跟进
  • 如果您当天的信息可以用硬编码进行编码,则只需跳过1-3并直接使用4。

好,我们开始:

  1. 覆盖CasSupportActionsConfiguration,仅添加initialFlowSetupAction bean

  2. 添加一个自定义类(将其命名为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>

看看这是否对您有帮助