Java会话过滤器与用户和管理员登录

时间:2012-07-24 19:41:49

标签: java authentication servlets

在我的网络应用程序中,我有两个主要部分

  1. 用户
  2. 管理
  3. 我正在使用java会话过滤器来检查用户会话并允许访问网站的特定部分。因此,用户只能访问用户页面部分,管理员可以访问管理部分。

    用户的会话过滤器已经实现,并且工作正常。它检查用户(来自数据库的用户名和密码 - mysql),并允许访问受限制的子文件夹,其中我有xhtml页面。

    如果我希望过滤器检查管理员部分身份验证(管理员用户名和密码存储在数据库中)并允许他们根据用户级别进行访问。

    我是否需要再创建一个过滤器 - admin?

    目前这是我对User的实现:

    package com.shadibandhan.ControllerLayer;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    import javax.servlet.*;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.Cookie;
    
    /**
     *
     * @author MUDASSIR
     */
    public class SessionFilter implements Filter {
    
        private ArrayList<String> urlList;
        private String toGoTo = null;
        private boolean userCookieExists = false;
    
        @Override
        public void init(FilterConfig config) throws ServletException {
    
            System.out.println("****************************************");
            System.out.println("***Session Filter Servlet initialized***");
            System.out.println("****************************************");
            String urls = config.getInitParameter("avoid-urls");
            System.out.println("The urls to avoid are = " + urls);
            StringTokenizer token = new StringTokenizer(urls, ",");
    
            urlList = new ArrayList<String>();
    
            while (token.hasMoreTokens()) {
                urlList.add(token.nextToken());
    
            }
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException {
    
            System.out.println("This is the doFilter method");
    
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            String contextRelativeURI = null;
            String contextRelativeURIForAdmin = null;
    
    
    
                contextRelativeURI = request.getRequestURI().substring(request.getContextPath().length());
    
    
            String contextPath = request.getContextPath();
            String remoteHost = request.getRemoteHost();
            String url = contextPath + contextRelativeURI;
            System.out.println("-----------------> Servlet path is = " + contextRelativeURI);
            System.out.println("-----------------> Context path is " + contextPath);
            System.out.println("-----------------> URL is " + url);
            System.out.println("-----------------> Remote Host is " + remoteHost);
            boolean allowedRequest = false;
    
            if (urlList.contains(contextRelativeURI)) {
                allowedRequest = true;
            }
    
            if (!allowedRequest) {
                HttpSession session = request.getSession(false);
                if (null == session) {
    
                    System.out.println("Session is not present");
                    response.sendRedirect(contextPath);
                    return;
    
                }
                if (null != session) {
    
                    System.out.println("Session is present");
                    System.out.println("\nSession no. is = " + session.getId());
    
                    if (session.getAttribute("logged-in") == "true") {
                        System.out.println("Session logged-in attribute is true, " + session.getAttribute("sessionUsername") + " is logged in.");
    
    
    
                            RequestDispatcher dispatcher = request.getRequestDispatcher(contextRelativeURI);
                            dispatcher.forward(request, response);
                            return;
                    } else {
                        System.out.println("Session logged-in attribute is not true");
                        response.sendRedirect(contextPath);
                        return;
                    }
                }
            }
    
            chain.doFilter(req, res);
        }
    
        @Override
        public void destroy() {
        }
    }
    

    这是我对过滤器的web.xml映射

    <filter>
            <filter-name>SessionFilter</filter-name>
            <filter-class>
                com.shadibandhan.ControllerLayer.SessionFilter
            </filter-class>
            <init-param>
                <param-name>avoid-urls</param-name>
                <param-value></param-value>
            </init-param>
        </filter>
    
        <filter-mapping>
            <filter-name>SessionFilter</filter-name>
            <url-pattern>/com.shadibandhan.Restricted/*</url-pattern>
        </filter-mapping>
    

    现在,我还将管理页面放在限制文件夹中吗?或者我把它们放在另一个单独的文件夹中 我还看到了here提到的servlet身份验证方法,该方法建议更改tomcat-users.xml文件,但我在db中有我的用户名和密码。

    请建议推荐的方法。

1 个答案:

答案 0 :(得分:0)

嗯,保护Web应用程序的最佳方法是使用容器管理身份验证,这样您的应用程序就不需要处理身份验证和授权机制。该机制在Java世界中称为JAAS

使用容器管理的身份验证通常需要在servlet应用程序上进行一些配置 - 除了Web应用程序中所需的更改 - 但您会更安全。既然你说你使用的是Tomcat,那么我会根据servlet容器给你最好的答案,其他的则以不同的方式配置。

<强> 1。配置Tomcat领域

首先,忘掉tomcat-users.xml(它是不安全的)并决定如何存储您的身份验证数据,LDAP服务器?一个数据库?哪个数据库?确定后,您需要修改Tomcat中server.xml文件夹下的conf文件,以添加新的realm。要创建的领域类型将取决于您之前的决定。

让我们说明一点:将用户添加到存储中。

<强> 2。配置Web应用程序

您现在需要在Web应用程序端配置身份验证方法。修改web.xml下的/WEB-INF文件。

您可以选择Basic authenticationForm based authentication。我更喜欢使用后者,因为它允许我为最终用户提供自定义表单。

我在这里提供的一些链接逐步描述了这个过程。它们还包括有关如何限制对不同类型用户访问部分应用程序的信息,例如:

<security-constraint>
  <web-resource-collection>
    <web-resource-name>AdminPages</web-resource-name>
    <description> accessible by authorised users </description>
    <url-pattern>/admin/*</url-pattern>
    <http-method>GET</http-method>
  </web-resource-collection>
  <auth-constraint>
    <description>These are the roles who have access</description>
    <role-name>ADMIN</role-name>
  </auth-constraint>
</security-constraint>

第3。了解用户

完成所有配置后,您的应用程序应该能够通过getRemoteUser()中的HttpServletRequest方法了解用户名。

修改

我建议为管理员和用户使用相同的表,并使用角色区分它们。如果您的admin实体需要常规用户无法使用的其他字段,请在admin返回HttpServletRequest.isUserInRole("ADMIN")时链接这两个表并处理true个字段。