![]() |
|
||
|
|
|
Аутентификация в сервлетах(Владислав Каменский) Сервлет, т.к. он является веб приложением, располагаемым на серверной стороне, может быть доступен множеству пользователей. Так как сервлеты могут работать с ресурсами этого сервера, понятное дело, что рано или поздно возникает задача ограничить этот доступ. Грубо говоря, если вам однажды захочется, чтобы ваш сервлет прежде, чем выполнять ряд определенных функций, произвел аутентификацию, то можете смело читать эту статью. Речь пойдет о Basic Authentication, механизм которой определен в спецификации HTTP 1.1. Данный механизм базируется на связке имя - пароль. Веб сервер вопрошает веб клиент, что бы тот аутентифицировал пользователя. Веб клиент получает у пользователя его имя и пароль, и пересылает их серверу. Basic Authentication не является секретным протоколом, так как имя и пароль передаются серверу посредством простого base64 кодирования. Да и к тому же сервер, на который высылается данная информация, не аутенифицируется. Т.е. если кто то задастся целью узнать пароли к вашему сервлету, то он это сможет сделать (конечно, это простому смертному не доступно, но все же вероятность велика.) Таким образом, если вы пишите приложения, например, для e-коммерции, то данного механизма аутентификации будет недостаточно. Я бы посоветовал дополнительно использовать HTTPS соединение (эта тема в статье затронута не будет). Ну а для простенького приложения этот механизм вполне сгодится. Итак, переходя от слов к делу. Ставим две задачи.
Начнем с первой задачи....
первая строчка вызывает функцию, которая проверяет в заголовке запроса имя и пароль
пользователя. Так как мы вызываем сервлет в первый раз, то понятное дело, что эта функция
ничего не найдет, и секретную информацию мы не увидим.
После ввода пользователя браузер передаст информацию, введенную пользователем в следующем виде - "Basic + имя:пароль" (эта строчка будет закодирована посредством base64 кодирования). Сервлет вызовется снова, теперь посмотрим более детально на функцию
Вы, наверное, уловили, что при любой ошибке функция возвращает false, и, следовательно, пользователь получит снова статус неавторизованного. В случае удачи пользователь увидит секретную информацию. Понятно, что данную функцию можно значительно сократить, и она является довольно избыточной, но мы оставим это на откуп читателям :) Замечу, что если пользователь нажмет кнопку Cancel на форме ввода, то его взору предстанет страничка, которую формируют строки, следущие за
Если их не написать, то пользователь увидит пустую страничку. Логичным будет, если в этом месте выдать форму, содержащую прощальные слова, говорящие о том что мол, сам пользователь отменил аутентификацию. И дать ссылочку на этот же сервлет, если он захочет повторить попытку аутентификации снова. Переходим ко второй задаче ... Например, соединяемся мы с сервлетом из апплета, причем понятное дело, что особо сервлет мы переписывать не будем. Нашей задачей будет соединиться с сервлетом, передать ему имя+пароль по схеме Basic Authentication, и, соответственно, получить входной поток с секретной информацией :)))
Здесь я не буду детально обсуждать технику соединения апплета и сервлета, это вы сможете найти в статье Доступ к БД из сервлета. Взаимосвязь апплет-сервлет. Решение проблемы русификации. Остановимся лишь на классе HttpMessage и заглянем внутрь его методов. Этим методом мы устанавливаем имя + пароль для нашего соединения. Если пользоваться классом com.oreilly.servelt.HttpMessage, то в общем-то этого вполне достаточно; для удачной аутентификации вызываем метод sendPostMessage(null), и все получится.
Но, для интереса, все же поглядим, как устроеН класс HttpMessage. Итак, метод
setAuthorization вызывал следующий метод, после того как закодировал строчку
данный метод, как мы видим, всего лишь заполняет Hashtable. Остается метод sendHeaders, который будет вызван из метода sendPostMessage:
Вот вроде бы и все. Все, что нужно сделать -- это вызвать метод
setRequestProperty(first,second) c двумя параметрами, первый - "Authorization",
второй - Итак, мы рассмотрели механизм аутентификации в сервлетах. Для удачной работы вам понадобятся следующие классы:
Что касается последних двух классов, то это кодировщик и раскодировщик, вместо них можно использовать какие-либо другие, которые вы найдете, либо напишите сами:). Основная их задача - закодировать/раскодировать строчку, с помощью base64 кодирования. Вот и все, пишите письма... Ресурсы:
дата последнего обновления: 15 января 2000 г. Заключение редактора.Хотелось бы поблагодарить Владислава за его статью, и добавить только, что описанная выше схема не единственная при работе с сервлетами. Вы также можете сделать свою форму для аутентификации и получать имя и пароль пользователя из нее. Или вообще доверить всю аутентификацию пользователя сервлет контейнеру, как это описано в спецификации сервлет (раздел "Security"). При этом надо учитывать, что в спецификации не описано как именно сервлет контейнер должен хранить информацию о пользователях, поэтому каждый производитель делает это по-своему и предоставляет разработчику свой API. Вячеслав Педак |
| Справка | Условия | |
| В начало | Логин | Комментарий к колонке | Поиск | Почта |