【问题标题】:inject model data into spring webflow in cas将模型数据注入cas中的spring webflow
【发布时间】:2019-09-13 06:04:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: cas spring-webflow


    【解决方案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 运行时注入 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 文件中。

    【讨论】:

    • 不幸的是,AbstractCasWebflowConfigurer 和 CasConfigurationProperties 不在 cas 6 中,我找不到 6 的等价物。有什么想法吗?
    • 在 cas-server-support-actions 中找到 CasConfigurationProperties
    • @mmaceachran 这个来自 leopal 的回答似乎比我的回答更好,如果可以的话,请使用这个回答,干杯!
    • 所以 CAS 文档是错误的。正确的依赖是 cas-server-core-webflow-api。这是正确的答案。
    • 如何通过登录 webflow 操作从 db 表中读取值?
    【解决方案2】:

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

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

    因此,如果我是您,而不是修补 spring webflow,我会尝试执行以下操作:

    注意:

    • 请记住,这可能不是推荐的方法,但我认为这会奏效,而且比覆盖 spring webflow 少得多
    • 正如您所说,您对 Spring boot 非常熟悉,所以我不会对详细实现感到厌烦,如果您/其他读者感到困惑,我可以跟进
    • 如果您当天的消息可以硬编码,只需跳过 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>
    

    看看对你有没有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2015-03-30
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多