2013-07-18 4 views
0

У меня есть веб-приложение, которое проверяет подлинность пользователей через стандартный механизм Tomcat. Более конкретно, я сконфигурировал JDBCRealm, который указывает на мои собственные таблицы пользователей и ролей, и я использую аутентификацию на основе форм, которая отправляет данные пользователя в действие j_security_check (как) и j_password). Ограничения безопасности настраиваются в моем файле web.xml.Аутентификация с использованием Tomcat realm или Facebook login

Теперь я хотел бы предоставить пользователям второй вариант входа в систему: Facebook. Я уже настроил вход в Facebook с помощью своего Javascript SDK, но у меня возникли проблемы с объединением обоих параметров входа. В идеале, когда пользователь входит в Facebook, мне придется моделировать аутентификацию в области Tomcat, чтобы убедиться, что пользователь Facebook ведет себя как обычный пользователь Tomcat. Это значит, что я также должен зарегистрировать пользователя Facebook в моей собственной таблице пользователей.

Моя первая идея состояла в том, чтобы зарегистрировать пользователя в моем собственном пользовательском столе сразу после того, как они завершили вход в Facebook (например, с помощью запроса Ajax). Когда этот запрос завершится, я смогу запустить отправку руководства на j_security_check.

Ответы на вопросы Facebook включают пользователя id и token, которые я мог бы использовать. Однако я не знаю, какую информацию использовать как j_password. Я даже не знаю, является ли использование формы-аутентификации лучшим вариантом.

Что было бы лучшим способом интегрировать оба параметра входа?

Большое спасибо!

ответ

0

Одним из вариантов может быть использование комбинированной Realm: См http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#CombinedRealm

Realm 1 должен быть JDBCRealm, а затем реализовать область 2 (FacebookRealm). Вы можете изменить порядок, на основе которого наиболее часто используется. См. Документы Tomcat о том, как реализовать область.

Конечно у вас нет пароля в FacebookRealm, но вы могли бы сделать следующий трюк:
JDBCRealm:
имя пользователя = имя пользователя/USERID в приложении
пароль = пароль
FacebookRealm:
имя пользователя = имя_пользователя/userId в вашей заявке
password = уникальный идентификатор пользователя, указанный Facebook

Это может позволить пользователям войти в систему любым способом.

В принципе, это может быть возможным использовать случай для входа в систему через FacebookRealm (первые шаги могут быть немного по-другому с JS SDK, но идея аналогична):
1. Пользователь отправляется через ссылку, для Facebook для аутентификации.
2. Facebook перенаправляет на ваш сервер токен.
3. Ваш сервер делает Facebook-звонок для проверки подлинности пользователя.
4. Ваш сервер знает, что он действительный пользователь, поэтому он вызывает метод login (username, facebookUserId) из Servlet. См .: http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#login(java.lang.String, java.lang.String)
4.1. Перед вызовом метода входа в базу данных убедитесь, что в вашей базе данных есть «имя пользователя» и «facebookUserId».
5. Tomcat FacebookRealm просто выполнит запрос базы данных для этого имени пользователя и идентификатора.

Надеюсь, это даст вам больше информации о том, как это можно сделать.
Другие варианты могут быть через Apache Shiro, Spring Security или, возможно, другие.

Смежные вопросы