在 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;
}
}
将我们的CustomWebflowConfiguration
class包含在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。
好的,我们开始:
覆盖 CasSupportActionsConfiguration
,仅添加 initialFlowSetupAction
bean
添加自定义 class(我们将其命名为 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>
看看这是否对你有帮助
我正在将 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;
}
}
将我们的CustomWebflowConfiguration
class包含在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。
好的,我们开始:
覆盖
CasSupportActionsConfiguration
,仅添加initialFlowSetupAction
bean添加自定义 class(我们将其命名为
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>
看看这是否对你有帮助