January
2006
Ограничение доступа или защита jsp-страниц
Posted in: Java Web Design, J2EE, Java technologies, J2SE |
В этой статье я приведу неболь?ой пример того, как защитить jsp-страницы ва?его приложения от несанкционированного доступа.
Все, что вам нужно, - это создать неболь?ой Java-класс и наследовать jsp-страницы от него.
А вот и упрощенный пример такого класса (импорт пакетов опущен):
public abstract class SecureJSP extends HttpServlet
implements HttpJspPage {
public void destroy() {
jspDestroy();
}
public void init() throws ServletException {
jspInit();
}
public void jspDestroy() { }
public void jspInit() { }
public void service(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
HttpSession session = request.getSession(false);
boolean isPassed = false;
if (session != null) {
if (session.getAttribute(“authorized”) != null)
isPassed = true;
}
if (!isPassed) {
forward(getErrorPageName(), request, response);
return;
}
_jspService(request, response);
}
private void forward(String page, HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
protected String getErrorPageName() {
return “/denied.jsp”;
}
}
После прохождения авторизации, в текущую сессию кладется некоторый объект (в примере - authorized). При загрузке страницы проверяется наличие этого объекта в сессии. Если объект не был найден, пользователь перенаправляется на страницу с сообщением об отказе в доступе (denied.jsp). После выхода пользователя из системы, объект обязательно нужно убрать из сессии.
Для указания того, что некоторая jsp рас?иряет Java-class, нужно в хедере страницы написать следующий код:
<%@ page extends=“SecureJSP”%>
Естественно класс SecureJSP можно значительно улуч?ить, но общее представление о защите веб-приложений, думаю, вы получили.
7 Comments »
RSS feed for comments on this post. TrackBack URI
Мне кажется, для таких целей луч?е использовать servlet filters.
Для этих целей луч?е использовать фильтры, так как это даст возможность сконцентрировать управление доступом в одном месте, а не распылять по куче jsp файлов.
Хотя этот прикол можно использовать как частный случай для блокирования контента странички.
А еще можно использовать AOP. Плюсы этого подхода можно почитать здесь http://citforum.gatchina.net/internet/javascript/aop/
?спользуйте луч?е фильтры
package promzilkonstrukciya;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class filter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String contextPath = req.getContextPath();
HttpSession session = req.getSession();
if((session!=null) && (session.getAttribute(”access”)!=null))
{
String param = session.getAttribute(”access”).toString();
if(param.equals(”granted”))
{
chain.doFilter(request, response);
}
}
else
{
if(req.getRequestURI().equals(contextPath+”delete.htm”) ||
req.getRequestURI().equals(contextPath+”upload”) ||
req.getRequestURI().equals(contextPath+”/adm.htm”) ||
req.getRequestURI().equals(contextPath+”/add.htm”) ||
req.getRequestURI().equals(contextPath+”/edit.htm”) ||
req.getRequestURI().equals(contextPath+”/xmlanswer”) ||
req.getRequestURI().equals(contextPath+”/load.htm”) ||
req.getRequestURI().equals(contextPath+”/scrpt.js”))
{
res.sendRedirect(contextPath + “/login.jsp”); //редирект на логин
}
else
{
chain.doFilter(request, response);
}
}
}
public void destroy() {
}
public void init(FilterConfig filterConfig) {
}
}
В первом else можно использовать как разре?енные страницы так и не разре?енные( для этого нада писать !req.getRequestURI().equals(contextPath+”delete.htm”)&&
и так далее
Для ограничения доступа луч?е на самом деле использовать фильтры, но страницы, для которых должна происходить проверка нужно определять не в теле фильтра, а в файле web-xml. Например:
SystemAccessFilter
filters.SystemAccessFilter
SystemAccessFilter
/adm.htm
тогда запрос на страницу adm.htm будет проходить через фильтр, где и будет проверяться авторизация.
Сорри за форматирование.
Для ограничения доступа луч?е на самом деле использовать фильтры, но страницы, для которых должна происходить проверка нужно определять не в теле фильтра, а в файле web-xml. Например:
SystemAccessFilter
filters.SystemAccessFilter
SystemAccessFilter
/adm.htm
тогда запрос на страницу adm.htm будет проходить через фильтр, где и будет проверяться авторизация.
Утверждать что луч?е использовать фильтры не стоит. Это всего ли?ь один из методов!
Например есть паттерн Front Controller.