在我的网络应用程序中,我有两个主要部分
我正在使用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中有我的用户名和密码。
请建议推荐的方法。
答案 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 authentication或Form 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
个字段。