LINUX.ORG.RU

Аутентификация с Java Servlet API

 , ,


0

1

Задача: сделать аутентификацию при помощи сервлета через БД (использую JDBC, postgreSQL в качестве СУБД). создал таблицу, содержащие имена и пароли (пока открытым текстом, хотя по совести надо хеш-сумму там хранить вроде как). И создал класс User с полями name + password.

Схема такая. Сделал фильтр (называл AuthFilter), который просматривает url-pattern и проверяет, содержится ли в request.getSession().getAttibute(«user»). Если нет - перенаправляет на страницу логина.

На странице логина (примерно также на странице регистрации с небольшими изменениями) - пользователь вводит имя и пароль в форму, отправляет POST-запрос... его обрабатывает LoginServlet, и если всё плохо - пишет ошибку. Если всё хорошо - добавляет request.getSession().setAttribute(«user»,user) (или вместо целиком user можно просто username, разницы особой думаю нет. Всё работает как надо.

А теперь проблемы:

1) если tomcat перезапускать, httpSession пропадает и пользователю приходится заново логиниться (даже если он браузер не перезапускал). Можно это как-то пофиксить? я предполагаю, хранить сессию в БД? целиком объект request.getSession() туда пихать, или как-то проще?

2) открытым текстом не есть гуд, как мне проще всего реализовать хранение, например, подсоленной md5/sha-суммы? какой библиотекой воспользоваться, где взять этот алгоритм md5/sha1/sha256?

P.S. В Spring security всё это есть и работает замечательно, и очень просто делается =) в том числе можно выбирать алгоритм хеш-суммы. Но мне надо разобраться, как это сделать, используя только Servlets + JSP(JSTL) + JDBC

P.P.S. Если несмотря на то, что «всё работает», я допустил какую-то логическую ошибку в алгоритме - буду благодарен, если кто на неё укажет. :)

Спасибо.

1) А ты в рабочем приложении часто томкэт собрался перезапускать?
2) Мнимум - в базе хранить хэш (sha2, например, хотя для паролей есть специальные алгоритмы хеширования - в инете поищи). Соль - можно и ее. Вообще, в инете (на том же хабре) полно статей на эту тему.

kovrik ★★★★★
()
Ответ на: комментарий от kovrik

1) нет. но мне сказали, что это типа плохо =) и надо это как-то пофиксить. (приложение учебное, по факту ничего полезного не делает, на реальные сервера развёртывать не планирую)

2) ок, поищу получше. больше интересовал именно первый пункт, тут ничего сложного не вижу (хотя была мысль использовать String.hashCode() - но наверное это неправильно, там небось не криптостойкий алгоритм)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Еще - а зачем для авторизации отдельный сервлет?
Я бы все в фильтр AuthFilter засунул:
1. Если авторизация пройдена (в сессии лежит user), то пропускаем дальше (в какой-нибудь action filter).
2. Если авторизация не пройдена, то:
2.1 Если запрошенный action - авторизация, то берем из requst'а полученные параметры - login и password, проверяем, валидные ли они. Если да, то создаем сессию и пускаем дальше, если нет - не пускаем.
2.2 Если запрошенный action требует авторизации - не пускаем, а редиректим на авторизацию
2.3 Если запрошенный action не требует авторизации - пускаем.

kovrik ★★★★★
()
Ответ на: комментарий от kovrik

Ну да... может быть так будет проще. Подумаю над этим.

LoginServlet у меня обрабатывает get и post-запросы. post соответственно отправляет логин/пароль, а get - страницу с формой (перенаправляет на jsp). Возможно, будет проще замапить какой-нить url на jsp(или даже html)-страницу (вместо doGet в сервлете).

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Просто при старте томкэта у тебя автоматически запускаются все сервлеты (если в их настройках не указано иное). Зачем постоянно держать отдельный сервлет, который нужен будет лишь для авторизации?
Авторизация - обычная jsp'шка, с обычной формой. Отправляет POST-запрос, в контроллере (или в AuthFilter) проверяешь credentials и тд.

kovrik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.