Обеспечение аутентификации пользователей в веб-приложении Java

В моем веб-приложении есть безопасная область, в которую пользователи входят через JSP. JSP отправляет имя пользователя и пароль сервлету, который затем проверяет, действительны ли учетные данные пользователя. Если они действительны, пользователь направляется к защищенному ресурсу. Как я могу гарантировать, что пользователи не смогут просто перейти к защищенному ресурсу без предварительной проверки?


person Deano    schedule 07.12.2008    source источник
comment
Я так понимаю, декларативная аутентификация не подходит для приложения (аутентификация, управляемая контейнером, через дескриптор развертывания).   -  person McDowell    schedule 08.12.2008


Ответы (4)


Распространенным подходом является установка токена в сеансе пользователя, т.е.

session.setAttribute("loggedIn", "true");

или даже

session.setAttribute("loggedInUser", "someUserName");

и проверьте это на любой странице, которая должна быть защищена. Хорошей стратегией является выполнение проверки с использованием фильтра сервлета, который вы прикрепляете к любой защищаемой странице. Если они не проходят проверку, фильтр может перенаправить на страницу входа. См. также здесь: http://java.sun.com/products/servlet/Filters.html

Это хорошая статья об использовании фильтров для аутентификации: http://www.developer.com/java/ent/article.php/3467801

person mtruesdell    schedule 07.12.2008
comment
Почему этот подход лучше, чем аутентификация, управляемая контейнером? - person erickson; 09.12.2008
comment
Это зависит от ваших потребностей. Для простого приложения это проще, но CMA — хорошее надежное решение для более сложных задач. Как всегда, ваш пробег может отличаться. - person mtruesdell; 09.12.2008
comment
Я бы предпочел что-то вроде session.setAttribute(user, userBean); Разумеется, без конфиденциальной информации. - person Adeel Ansari; 10.12.2008

Что насчет использования ограничения безопасности в вашем web.xml:

<security-constraint>
      <web-resource-collection>
         <web-resource-name>Secure</web-resource-name>
         <url-pattern>/secure/*</url-pattern>
      </web-resource-collection>
person LenW    schedule 08.12.2008
comment
См., например, этот вопрос: stackoverflow.com/questions/344474/ - person Warren Blanchet; 20.12.2008

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

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

person Rolf    schedule 07.12.2008

Безопасность действительно трудно получить правильно. Гораздо больше, чем вы обычно думаете. Использование фреймворка (на ум приходит Acegi) или стандартный раздел "" web.xml как указанный LenW является обязательным! По крайней мере, используйте фильтр для обработки части авторизации вашей безопасности.

Мне не очень нравится решение с использованием единой точки входа (как предложено Рольфом). Мне кажется, что на вашу архитектуру наложено искусственное ограничение. И есть много веских причин иметь несколько сервлетов в веб-приложении.

Что бы вы ни делали, не используйте метод, при котором вы полагаетесь на ручной код на каждой странице (например: каждый JSP, начинающийся с «if user_authentified...»). Вы забудете его куда-то положить...

person Guillaume    schedule 08.12.2008