如何防止没有管理员访问权限的用户在面孔中保存具有特定状态的表单

How do I prevent users without admin access from saving a form with a certain status in faces

我正在尝试阻止没有管理权限的用户保存状态为 "complete" 的表单,如果它尚未被选中(例如,允许用户打开表单并编辑他们的数据) ,即使状态设置为完成,他们也无法最初将其文档标记为完成)。

允许用户更改 'completed' 文档的原因是电子记录只是幕后工作过程的反映。为了将项目标记为完成,必须完成其他几个过程。可以事后编辑这些信息,以解决转录或措辞中的错误。

我认为如果用户试图 将状态 更改为 ,则只需利用 onChange 事件重新选择先前的选择就足够了完全的 。我正在寻找一种优雅的方式来做到这一点,希望不要将先前的选择存储在页面上的单独字段中,因为它已经存储在其他地方。 grantBacking.editGrant.statusCode 是表单的 saved/current 状态代码。此外,至少有三种不同的角色类型,包括只读权限、'Add' 和 'Administrator'。读取 - 不言自明,添加 - 可以更改表单但不能完成表单,管理员 - 可以进行更改并将表单状态标记为 "complete"。

这是我目前拥有的:

<t:panelGroup>
<sec:authorize ifNotGranted="ADMINISTRATOR">

    <h:selectOneMenu id="grantStatus" onchange="#checkGrantStatusPermissions(this,grantBacking.editGrant.statusCode)" onmouseover="Tip('#{msg_bundle.grant_status_help}')" value="#{grantBacking.editGrant.statusCode}">
        <f:selectItems value="#{grantBacking.grantSelectStatusForNonAdmin}" />
    </h:selectOneMenu>
</sec:authorize>

<sec:authorize ifAnyGranted="ADMINISTRATOR">

    <h:selectOneMenu id="grantStatusForAdmin" onmouseover="Tip('#{msg_bundle.grant_status_help}')" value="#{grantBacking.editGrant.statusCode}">
        <f:selectItems value="#{grantBacking.grantSelectStatus}" />
    </h:selectOneMenu>
</sec:authorize>

<sec:authorize ifAnyGranted="ADD">
<a4j:commandLink id="qsave2" render="@all" onmouseover="Tip('Click to quick save')" action="#{grantBacking.saveGrant}">
    <h:graphicImage title="Click this to quick save the grant/contract" style="border-style:none;" height="20px" width="15px" library="default" name="img/icons/disk.png" />
</a4j:commandLink>
</sec:authorize>

<script type="text/javascript">
    function checkGrantStatusPermissions(field, originalValue){
        if(originalValue.equalsIgnoreCase("complete")){
            return  
        }
        else{
            document.getElementByID(field).value = originalValue.value;
        }
    }
</script>

在项目被标记为完成之前,您可以像这样构建您的 selectItems 来禁用该选项:

<f:selectItems value="#{grantBacking.grantSelectStatusForNonAdmin}" var="v"
    itemDisabled="#{grantBacking.shouldDisableOption(v)}"/>

如果您的 EL 版本不包含传递参数的功能,您可以通过使用内部 class 来实现同样的功能,该内部 class 包含您的值、标签,并且具有用于 shouldDisable 的无参数方法。

在提交已完成的表单时,如果用户无法将其从“完成”更改为其他状态,则只需将 selectMenu 设置为只读。如果可以,那么在这种情况下,您的 shouldDisable 逻辑应该 return false。

这样做可以防止用户选择已知的错误值,并避免您编写用户不希望导致潜在错误报告的代码行为。