c:if和c:选择无法有条件地构建ui:composition

时间:2017-12-27 14:06:14

标签: jsf jstl facelets

现在一直在努力解决这个问题。

我有一个启动时加载的Apache Shiro login.xhtml页面。

经过身份验证后,用户将被重定向到与Apache Shiro login.xhtml页面相同的文件夹中的index.xhtml页面(两者都在webapp文件夹中)。

我希望通过在index.xhtml中使用它来阻止未经过身份验证的用户加载UI:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
      xmlns:jsf="http://xmlns.jcp.org/jsf"
      xmlns:p="http://primefaces.org/ui"
      xmlns:o="http://omnifaces.org/ui"
      xmlns:of="http://omnifaces.org/functions">
<c:if test="${authUserDetail.userAuthenticated}">
    <ui:composition template="/WEB-INF/templates/masterTemplate.xhtml">
        <ui:define name="title">Title Page</ui:define>
        <ui:define name="content">
            <ui:include src="/WEB-INF/home/home_page.xhtml"/>
        </ui:define>
    </ui:composition>
</c:if>
<c:if test="${!authUserDetail.userAuthenticated}">
    <h:outputLabel
            value="You are not authorized to access this page."/>
</c:if>
</html>

使用支持bean AuthUserDetail.java,如下所示:

package com.mycomp.view.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.omnifaces.cdi.ViewScoped;

import javax.annotation.PostConstruct;
import javax.inject.Named;
import java.io.Serializable;

@Named
@ViewScoped
public class AuthUserDetail implements Serializable {

    private boolean userAuthenticated = false;

    public AuthUserDetail() {
        Subject currentUser = SecurityUtils.getSubject();
        this.userAuthenticated = currentUser.isAuthenticated();
    }

    public boolean isUserAuthenticated() {
        return userAuthenticated;
    }

    public void setUserAuthenticated(boolean userAuthenticated) {
        this.userAuthenticated = userAuthenticated;
    }
}

如果我在没有替换<ui:composition...代码的情况下进行测试(仅使用单个<h:outputLabel>它似乎可以正常工作。但是按原样使用它,即使用户未登录也始终呈现整个页面(使用谷歌Chrome浏览器的隐身功能)。

我缺少什么?

0 个答案:

没有答案