Spring Webflow - 防止直接访问子流

时间:2014-05-05 10:19:45

标签: spring web-applications spring-security spring-webflow

我在我的webapp中使用Spring Web Flow,我想知道是否有一般方法可以防止直接访问某些子流。这些子流只能从某些流中访问,而不是直接通过url访问,所以在这些子流中我想检查"如果我是从流中调用的话#34;。

有没有实现它的机制?我正在考虑春季保安,但我找不到任何有用的功能来制定这种限制。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用输入映射器属性进行检查,如下所示。假设您有一个调用'subflow-flow'的父流。您需要传递包含父流名称的输入值:

    <?xml version="1.0" encoding="UTF-8"?>
    <flow xmlns="http://www.springframework.org/schema/webflow"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/webflow
            http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">  
        ... 
        <subflow-state id="subflow-flow" subflow="subflow-flow">
            <!--flowInitiatedBy should be different for each different parent flow-->
            <input name="flowInitiatedBy" value="'parentFlowName'"/>
            <transition on="invalidAccess" to="someViewWithMessage"/>
            <transition on="processedSubflow" to="someOtherState"/>
        </subflow-state>
        ...
    </flow>

然后在子流中,您可以检索parentflowname并在yourAction类中执行检查。您可以将子流定义为:

    <?xml version="1.0" encoding="UTF-8"?>
    <flow xmlns="http://www.springframework.org/schema/webflow"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/webflow
            http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
            start-state="start">            
        <input name="flowInitiatedBy" type="java.lang.String"/>
        <action-state id="start">
            <evaluate expression="yourAction.checkAccessibility(flowRequestContext)"/>
            <transition on="invalidAccess" to="verifyWhetherDraftsExists"/>
            <transition on="continue" to="continueToState"/>
        </action-state>
        <!--define other states for continue transition -->
        ...
        <end-state id="invalidAccess"/>
        <end-state id="processedSubflow"/>
    </flow>

在你的动作类中:

    public class YourAction{
    ...
    public String checkAccessibility(RequestContext context){
        String flowInitiatedBy = context.getFlowScope().get("flowInitiatedBy");
        //flowInitiatedBy will be empty if initiated by url.
        if(flowInitiatedBy is empty){
            return "invalidAccess";
        }else{
            // dosomething
            return "continue";
        }
    }
    ...
    }

希望这有帮助。

答案 1 :(得分:0)

我也希望有一种内置的简单机制。但是,我只是采用了一种与我认为分享的略有不同的方式。也就是说,由于我的Subflow知道它自己的名字,我只是在Flow配置中检查了第一个状态,检查流ID(名称)是否与该硬编码名称匹配:

<decision-state id="subOnly">
    <if test="flowExecutionContext.definition.id == 'thisSubflowFlowName'" then="invalidAccess" else="mySubflowFirstState"/>
</decision-state>

其中&#34; invalidAccess&#34;与先前的答案相同,是end-state