【问题标题】:Are there some issue at inserting some check into template?在模板中插入一些检查是否有问题?
【发布时间】:2012-01-30 10:55:52
【问题描述】:

如果我在模板文件中插入一些检查,会有一些问题吗?例如,如果我将用户检查插入模板的 xhtml 文件,如果我在所有 xhtml 页面中使用此模板,可能会出现一些安全问题?

类似:

<?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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title><ui:insert name="title">Default Title</ui:insert></title>
        <h:outputStylesheet name="css/jsfcrud.css"/>
    </h:head>
    <h:body>
        <h:panelGroup rendered="#{userBean.cognome!=null}">
            Utente connesso:<h:outputText value="#{userBean.cognome}"/>&nbsp;<h:outputText value="#{userBean.nome}"/>
            <h1><ui:insert name="title">Default Title</ui:insert></h1>
            <p><ui:insert name="body">Default Body</ui:insert></p>
        </h:panelGroup>
    </h:body>
</html>

【问题讨论】:

    标签: security jsf-2


    【解决方案1】:

    我了解到您在显示内容之前会检查登录用户是否存在。这样可能没问题,但是任何未登录就打开页面的用户都会收到空白内容。这不是很用户友好。您想将未登录的用户重定向到登录页面。

    如果您使用 Java EE 提供的容器管理身份验证,通常已经考虑到这一点。但是,如果您要进行家庭认证,则需要为此创建一个servlet filter。如果您将所有受限页面收集在一个公共文件夹(如 /app)中,以便您可以为过滤器使用一个公共 URL 模式,例如/app/*(并将所有公共页面如登录页面放在这个文件夹之外),那么你应该可以如下过滤掉未登录的用户,假设#{userBean}是一个会话范围的 JSF @ManagedBean 或您自己放入会话范围的某些会话属性:

    @WebFilter("/app/*")
    public class LoginFilter implements Filter {
    
        @Override
        public void init(FilterConfig config) throws ServletException {
            // NOOP.
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            HttpSession session = request.getSession(false);
            UserBean user = (session != null) ? (UserBean) session.getAttribute("userBean") : null;
    
            if (user == null || user.getCognome() == null) {
                response.sendRedirect(request.getContextPath() + "/login.xhtml"); // No logged-in user found, so redirect to login page.
            } else {
                chain.doFilter(req, res); // Logged-in user found, so just continue request.
            }
        }
    
        @Override
        public void destroy() {
            // NOOP.
        }
    
    }
    

    另见:

    【讨论】:

    • 谢谢巴鲁斯!你赢得了赏金!
    • 如果我会给你赏金,我必须只点击“接受”,对吧?
    • 不客气。为了给予赏金,我相信您必须单击接受按钮正下方的其他按钮(回答者看不到,但提问者可以“看到”)。但您也可以等待赏金期结束,如果有至少 2 票赞成,赏金将自动授予接受的答案。
    【解决方案2】:

    我怀疑您会遇到安全问题,但请确保将模板放在 WEB-INF 文件夹中,这样模板就不会从外部看到。我还建议您使用 Spring-Security。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      相关资源
      最近更新 更多