2013-04-19 1 views
2

Я планирую настроить веб-сервис, к которому будут доступны другие сайты. Идея заключается в том, что веб-сервис должен быть защищен и что каждый сайт, обращающийся к веб-службе, будет аутентифицирован против своего зарегистрированного домена.Междоменная аутентификация

  • Владельцы сайта будет зарегистрировать свой домен (например, foo.com) с веб-передний конец моего веб-сервиса
  • Далее, их сайт будет выдавать методы HTTP (GET, PUT, POST, DELETE и т.д.), которые, как правило, будут Javascript HTTP Запрос
  • Сайты, получающие доступ к веб-службе, не нуждаются в аутентификации; веб-служба определит, был ли зарегистрирован домен, из которого он поступает, если я обработаю запрос в соответствии с доменом сайта.

Проблема, которую я имею в виду, в настоящее время, является ли такая система будет «масштаб» и будет «работать»

Я работал как с Apache Shiro и Spring Security, но я никогда не сталкивался с такого рода требования ,

+0

Вы хотите аутентифицироваться в соответствии с URL-адресом клиента? Например, если пользователь получает доступ с 'http: // foo.com', он получит разрешения пользователя foo.com после аутентификации, если пользователь получит доступ с' http: // example.org', он будет использовать example.org разрешения и т. д. Какую масштабную проблему вы видите здесь? Кроме того, если пользователь получает доступ с 'http: // subdomain.foo.com', какой пользователь должен после аутентификации? также foo.com? – Michael

+0

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

+0

@michael Правильно, это именно то, что мне нужно. Что касается «шкалы», я просто использовал это слово для обозначения этой идеи, если бы эта идея была превращена во что-то выполнимое. – 2013-04-19 14:21:58

ответ

0

Обратите внимание, что при разработке ваша система будет аутентифицировать пользователей без пароля. Это означает, что при использовании доступа, если пользователь получает доступ с http://foo.com, он получит разрешения пользователя foo.com после аутентификации без предоставления пароля. Я хочу предложить, чтобы решить вашу проблему с вашим собственным PreAuthenticatedProcessingFilter: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#d0e6167 В вашей реализации getPreAuthenticatedPrincipal, просто получить URL запроса, извлечь домен (без субдомена) информацию из запроса URL и проверку подлинности с помощью PreAuthenticatedAuthenticationProvider. AuthenticationUserDetailsService из PreAuthenticatedAuthenticationProvider необходимо загрузить зарегистрированные регионы из базы данных.

+0

Я пропустил упоминание о том, что запрос будет поступать из Javascript Ajax. Таким образом, кросс-домен – 2013-04-21 02:22:29

+0

Вы можете получить представление о том, что я пытаюсь сделать здесь: http://stackoverflow.com/questions/16127369/get-the-origination-host-of-a-javascript-http-request – 2013-04-21 02:30:33

0

Я думаю, что я вижу способ сделать это с помощью настраиваемого фильтра:

  1. Добавить вас есть custom filter, что-то вроде PartnerSiteCheckerFilter. Он будет иметь список IP-адресов для каждого сервера партнеров. Он будет проверять только запросы API (например,/api/**). Любой запрос, не соответствующий IP-адресу, будет отклонен (AccesDeniedException).
  2. В процессе регистрации сохранить новый домен к БД, а затем получить список доверенных IP-адресов

    InetAddress[] hosts = InetAddress.getAllByName("www.stackoverflow.com"); 
    for(InetAddress host : hosts) { 
        String ip = host.getHostAddress(); 
    } 
    // add ip to a list 
    
  3. Обновить список IP-адресов внутри PartnerSiteCheckerFilter.

  4. Подготовьте некоторый компонент, который прочитает список доменов при запуске приложения из БД, затем получит IP для каждого сервера и введет этот список в PartnerSiteCheckerFilter.
  5. Список доверенных серверов на домен может быть изменен во время выполнения. Может быть, будет полезно предоставить какой-то способ его обновления.

Надеюсь, это поможет. Не стесняйтесь задавать любые вопросы.

+0

проблема заключается в том, что запрос не будет поступать из HTTP-запроса Servlet или любого сервера, скорее это будет запрос клиента, в частности HTTP-запрос Javascript ... – 2013-04-21 02:21:02