Java

         

Идентификация/аутентификация


Обычно WEB приложение запрашивает регистрационное имя и пароль с помощью формы, данные проверяются (сравниваются с базой данных, например) и на основании сравнения принимается решение об аутентификации текущего пользователя. Далее в сессию клиента попадает объект, инкапсулирующий пользователя (а в cookie браузера отправляется идентификатор сессии).

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

В нашем приложении аутентификация не реализована в полной мере, так как она не представляет интереса с точки зрения данной статьи. Существуют по умолчанию два пользователя User1 и User2, логин каждого пользователя осуществляется декларативно со страницы login.vm;


Очевидно, что аутентификация нужна не для всех областей нашего сайта, следовательно, нам необходимо сделать следующее – перед вызовом контроллеров, для которых аутентификация необходима, мы будем проверять пользователя, и в случае если он не аутентифицирован, то перенаправляем запрос на страницу с формой аутентификации.

Для того, что бы реализовать это в АОП нам необходимо сделать следующее:

Созданный аспект приведён ниже:

package aop.example;

import aop.example.model.*; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException;

/** * Аутентификационный аспект * обеспечивает проверку того что
все контроллеры * нуждающиеся в пользователе
его получат :) * @author Zubairov Renat */ public aspect AuthenticationAspect {

// pointcut определяющий метод где мы
будем отлавливать исключение // если пользователь не аутентифицирован // в нашем случае это метод фильтра public pointcut doFilterMethod
(ServletRequest srequest, ServletResponse sresponse,
EntranceFilter filter) : execution(void aop.example.
EntranceFilter.doFilter(ServletRequest,
ServletResponse, FilterChain)) && args(srequest, sresponse,
FilterChain) && this(filter);

// pointcut определяющий методы для которых
необходима аутентификация // в нашем случае это метод сервлета
ViewServlet doGet // так же захватываем контекст а именно
HttpServletRequest public pointcut authenticationNeeded
(HttpServletRequest request) : execution(* aop.example.ViewServlet.doGet
(HttpServletRequest, HttpServletResponse))
&& args(request, HttpServletResponse);

/** * Advice запускающийся перед методами нуждающимися
в аутентификации * и если пользователь не найдён в сесси, то
выбрасывающий исключение */ before(HttpServletRequest request) :
authenticationNeeded(request) { // В нашем случае только тогда когда
есть хоть один параметр // у сервлета, только тогда необходима
аутентификация if (request.getParameterMap().size() > 0) { if (request.getSession().
getAttribute(EntranceFilter.USER_KEY) == null) { throw new
AuthenticationException("User not logged in"); } if (!(request.getSession().
getAttribute(EntranceFilter.USER_KEY) instanceof User)) { throw new
AuthenticationException
("Anonymous user access denided"); } } }



Содержание раздела