30
January

Ограничение доступа или защита 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 можно значительно улучшить, но общее представление о защите веб-приложений, думаю, вы получили.

4 Comments »

RSS feed for comments on this post. TrackBack URI



Igor
August 5, 2006 #

Мне кажется, для таких целей лучше использовать servlet filters.

Сергей Друзькин
August 9, 2006 #

Для этих целей лучше использовать фильтры, так как это даст возможность сконцентрировать управление доступом в одном месте, а не распылять по куче jsp файлов.
Хотя этот прикол можно использовать как частный случай для блокирования контента странички.

Андрей
October 5, 2007 #

А еще можно использовать AOP. Плюсы этого подхода можно почитать здесь http://citforum.gatchina.net/internet/javascript/aop/

almostlost
March 16, 2008 #

Используйте лучше фильтры

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”)&&
и так далее

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>