Как дать cname прямую поддержку программного обеспечения Saas - PullRequest
10 голосов
/ 10 июня 2009

У меня есть веб-приложение, где пользователи могут создавать свои учетные записи и пользоваться сервисом. Теперь я хочу дать им возможность настраивать домен, где app.customer1web.com points_to myservice.com с идентификатором пользователя customer1 как только он настраивает пользовательский домен, для всего мира похоже, что мой сервис работает на его машине. Многие сервисы, такие как blogger, wp.com, tumblr дают эта функция.

как мне это сделать? Я использую Java, чтобы написать свое веб-приложение. Как сопоставить доменное имя с идентификатором пользователя при поступлении запроса?

Ответы [ 3 ]

12 голосов
/ 13 декабря 2009

Как сопоставить имя домена с идентификатором пользователя при поступлении запроса?

Очевидно, вам придется хранить эту информацию где-то, скорее всего, в базе данных.

  1. Добавить таблицу базы данных domains со столбцами:

    • CUSTOMERID
    • имя
    • активный (1 или NULL)
    • вызов

    Добавьте уникальный ключ для (name, active), чтобы доменное имя отображалось только один раз.

  2. Когда клиент пытается добавить домен, добавьте строку с active = NULL и вызовом, установленным в случайную строку.

    Покажите случайную строку клиенту и попросите его разместить на сайте веб-страницу с ней или создать фиктивную DNS-запись для подтверждения владения доменом (так делают Google Apps).

    Вы можете подтвердить право собственности, отправив электронное письмо административному контактному лицу или другим способом.

  3. Когда клиент говорит, что он выполнил то, что вы приказали ему сделать на шаге 2, проверьте его и установите active = 1, challenge = NULL.

    Если домен ранее был активным для какого-либо другого клиента, удалите эти записи или установите значение active = 0.

  4. Попросите клиента добавить запись CNAME для своего домена и переслать ее на свой домен, например, hosted.myservice.com (Google использует ghs.google.com для Служб Google).

  5. При поступлении запроса выполните

    SELECT customerId FROM domains WHERE name=:requestDomain AND active=1
    

Лучшим способом может быть автоматическое предложение вашим клиентам домена в формате <customername>.myservice.com, в дополнение к пользовательских доменов. Это дает вам два преимущества:

  • Клиенты, которые не хотят использовать собственный домен, могут по-прежнему настраивать свою страницу входа, например с логотипом компании.

  • Для пользовательских доменов вы можете попросить клиента переадресовать их на <customername>.myservice.com вместо универсального hosted.myservice.com.

    Это позволяет вам разделять клиентов по горизонтали между несколькими серверами, не обращаясь к клиентам с просьбой изменить что-либо с их стороны. Например, вы можете дать клиентам возможность выбрать, хотят ли они, чтобы их учетная запись размещалась в ЕС или США. Когда они меняют его, просто передайте свои данные и обновите <customername>.myservice.com. Их пользовательский домен будет работать автоматически.

Для этого вам нужно настроить DNS-запись с подстановочными знаками для *.myservice.com (если только вам не нужна последняя функция, в этом случае вам придется управлять отдельными записями).

1 голос
/ 11 декабря 2009

Одним из решений, которое вы могли бы использовать, является установка WildCard DNS Record для вашего приложения, и чтобы само приложение проверило RequestURI, чтобы увидеть, с каким именем хоста приходят пользователи.

Я знаю, что это очень расплывчатый ответ, но звучит так, как будто настроена запись WildCard, а единственная функция, проверяющая имя хоста, - ваша лучшая ставка. Таким образом, вам не нужно настраивать запись DNS каждый раз, когда клиент регистрируется, и у вас больше времени для себя, чтобы заняться другими делами ... например, добавлением новых функций в свое приложение!

0 голосов
/ 10 декабря 2009

Я не совсем уверен, действительно ли я понимаю, что вы хотели бы сделать, но я стараюсь дать вам возможное решение (по крайней мере, для части вашей проблемы с Java).

Одна из возможностей - настроить сервер приложений таким образом, чтобы каждый запрос обрабатывался одним сервлетом (web.xml). Этот сервлет может узнать о URL-адресе запроса ( HttpServletRequest.getRequestURI ) и извлечь имя пользователя. Тогда вы узнаете о пользователе и сможете использовать эту информацию для любых действий.

Помните, что в том, что вы хотели бы сделать, задействовано много DNS-вещей! (По крайней мере, так, как я понимаю.)

...