【发布时间】:2019-09-13 06:04:50
【问题描述】:
我正在将 CAS 4 升级到 CAS 6。我已经完成了几个 Spring Boot 2 应用程序,所以我知道我在那里做什么。我什至可以做一些 webflow,但只能从头开始。
文档明确指出不要弄乱基本 webflow xml,并“注入”您自己的服务。
如何“注入”服务?我真的只需要在登录页面添加当天的消息。
有人有这么简单的例子吗?
【问题讨论】:
标签: cas spring-webflow
我正在将 CAS 4 升级到 CAS 6。我已经完成了几个 Spring Boot 2 应用程序,所以我知道我在那里做什么。我什至可以做一些 webflow,但只能从头开始。
文档明确指出不要弄乱基本 webflow xml,并“注入”您自己的服务。
如何“注入”服务?我真的只需要在登录页面添加当天的消息。
有人有这么简单的例子吗?
【问题讨论】:
标签: cas spring-webflow
在下面找到我的方法,在 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 运行时注入 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;
}
}
在META-INF/spring.factories 中包含我们的CustomWebflowConfigurationclass:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=your_package.CustomWebflowConfiguration
最后一步是在视图中显示添加的消息。添加此行即可实现
<div th:utext="${dailyMessage}"></div>
在templates/casLoginView.html 文件中。
【讨论】:
...将当天的消息添加到登录页面...
在 CAS 中不建议直接修改 spring webflow。 read this for more info
因此,如果我是您,而不是修补 spring webflow,我会尝试执行以下操作:
注意:
好的,我们开始:
覆盖CasSupportActionsConfiguration,只添加initialFlowSetupAction bean
添加自定义类(命名为MyInitialFlowSetupAction)并实现InitialFlowSetupAction
在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>
看看对你有没有帮助
【讨论】: