0

我有一个登录过滤器,如下所示:

@WebFilter("*.xhtml")
public class LoginFiltre implements Filter {
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) arg0;
        HttpServletResponse res = (HttpServletResponse) arg1;
        System.out.println(req.getRequestURI());
        System.out.println(req.getContextPath());
        Credentials credentials = (Credentials) req.getSession().getAttribute(
                "credentials");

        if (req.getRequestURI().contains("login")) {
            System.out
                    .println("login olmak istiyor faces servlet e yönlendirilecek");
            chain.doFilter(arg0, arg1);
        } else if (credentials != null
                && credentials.getUsername().length() != 0
                && credentials.isIsloggedin()) {
            System.out.println("login olmus faces servlet e yönlendiriliyor");
            chain.doFilter(arg0, arg1);
        } else {
            System.out.println("login olmamis yönlendirilecek");
            res.sendRedirect(req.getContextPath() + "/login.xhtml");
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

我希望这个过滤器检查除登录页面之外的所有请求的身份验证,如何将所有页面放在一个名为secure(login.xhtml 除外)的文件夹中并为此过滤器使用/secure/* 之类的前缀映射?

4

2 回答 2

4

这个检查

if (req.getRequestURI().contains("login")) {

弱。例如,如果您有一个logins.xhtml所有登录用户的列表怎么办?您允许每个URL 只包含字符“登录”。您应该执行精确的URL 匹配。

String loginURL = req.getContextPath() + "/login.xhtml";

if (req.getRequestURI().equals(loginURL)) {

并在重定向 URL 中重用它:

res.sendRedirect(loginURL);

与具体问题无关,这个过滤器也阻塞了 CSS/JS 资源。所以所有<h:outputStylesheet><h:outputScript>资源都停止工作。您可能也希望允许它们。此外,.xhtml扩展和您的问题历史表明您正在使用 JSF。当会话过期或用户在另一个选项卡上注销时,此过滤器将失败,并且对 JSF ajax 请求没有反馈。相反,您应该返回一个特殊的 XML 响应来触发 JavaScript 端的重定向。您可以在此答案中找到另一个涵盖所有内容的示例:会话到期时的授权重定向在提交 JSF 表单时不起作用,页面保持不变

于 2013-04-03T20:21:30.197 回答
0

我知道这不是您要寻找的答案,但安全性是最好留给专业人士的事情之一。除非你有一组非常独特的需求,否则你应该尝试找到一个合适的开源库,例如Spring SecurityApache Shiro等。他们花了很多时间来确保它们的实现是安全的,而且它们是广泛部署,因此他们有很多目光。当您推出自己的安全性时,您冒着引入以后可能导致违规的错误的风险。

于 2013-04-03T19:56:26.667 回答