Java会话filter与用户和管理员登录

在我的Web应用程序中,我有2个主要部分

  1. 用户
  2. 管理员

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

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

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

我需要再创建1个filter – 管理员吗?

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

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 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(); 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() { } } 

这是我对filter的web.xml映射

  SessionFilter  com.shadibandhan.ControllerLayer.SessionFilter   avoid-urls     SessionFilter /com.shadibandhan.Restricted/*  

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

请建议推荐的方法。

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

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

1.配置Tomcat领域

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

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

2.配置Web应用程序

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

您可以选择基本身份validation或基于表单的身份validation 。 我更喜欢使用后者,因为它允许我为最终用户提供自定义表单。

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

   AdminPages  accessible by authorised users  /admin/* GET   These are the roles who have access ADMIN   

3.了解用户

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

编辑:

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