0

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

  1. 用户
  2. 行政

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

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

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

我需要再创建 1 个过滤器 - 管理员吗?

目前这是我对用户的实现:

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>

现在,我是否也将管理页面放在受限文件夹中?或者我把它们放在另一个单独的文件夹中?我还看到了这里提到的 servlet 身份验证方法,它建议在 tomcat-users.xml 文件中进行更改,但我在数据库中有我的用户名和密码。

请建议推荐的方法。

4

1 回答 1

0

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

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

1.配置Tomcat领域

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

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

2. 配置网络应用

您现在需要在 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

于 2012-07-24T22:54:41.163 回答