现在一直在努力解决这个问题。
我有一个启动时加载的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浏览器的隐身功能)。
我缺少什么?