Несколько приложений, использующих Authlogic, аутентифицирующих пользователей в одной базе данных? - PullRequest
5 голосов
/ 27 октября 2009

Я видел вопрос, заданный несколько раз в группах Google, но никто, кажется, не отвечает на вопрос с ответом или решением. Можно ли использовать центральную базу данных для создания и аутентификации пользователей из нескольких приложений Rails, используя Authlogic?

Сейчас я не могу использовать OpenID, я бы с удовольствием, но мой клиент его пока не поддерживает .

Ответы [ 5 ]

8 голосов
/ 10 ноября 2009

Похоже, что до сих пор не было опубликовано решение исходного вопроса.

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

Я уже использовал Authlogic для некоторых других проектов, поэтому я надеялся, что это будет так же просто, как изменить некоторые параметры конфигурации.

Вот мое решение:

Я создал основное приложение для отслеживания пользователей. В приложении не было ничего особенного. Это позволило пользователям регистрироваться, входить в систему, выходить из системы и т. Д. После входа в систему пользователи могут переходить к другим приложениям.

В файле environment.rb моего пользовательского приложения и каждого приложения, нуждающегося в аутентификации с базовым приложением, необходимо настроить ключ сеанса и домен таким же.

config.action_controller.session = {
  :session_key => '_my_app_session',
  :secret      => '_long_secret_session_key_here',
  :domain => ".basedomain.com" 
}

Каждое из моих приложений находится под своим собственным поддоменом, таким как app1.basedomain.com app2.basedomain.com Я не уверен, будет ли это работать иначе без каких-либо изменений.

В каждом приложении создайте сеанс пользователя

class UserSession < Authlogic::Session::Base   
end

и пользовательские модели.

class User < ActiveRecord::Base
   establish_connection "users_database"
   acts_as_authentic 
end

Что отличается в этой модели пользователя тем, что теперь у нее есть метод установления соединения. «users_database» находится в файле database.yml и указывает на базу данных для центрального приложения управления пользователями.

Я не заходил так далеко, чтобы входить и выходить из моих под-приложений, но если бы вы это делали, вам также пришлось бы создавать UserSessionsController.

В каждом приложении, которое использует аутентификацию, я включил несколько вспомогательных методов в ApplicationController, например,

   def current_user_session
      return @current_user_session if defined?(@current_user_session)
      @current_user_session = UserSession.find
   end

   def current_user
      return @current_user if defined?(@current_user)
      @current_user = current_user_session && current_user_session.record
   end

   def require_user
     unless current_user
       store_location
       redirect_to 'http://main_user_login_page'
       return false
     end
   end

Затем я могу использовать 'require_user' в моих контроллерах, где я хочу аутентификацию, как и в моем основном пользовательском приложении.

Надеюсь, это поможет.

Чейз М Грей

2 голосов
/ 30 октября 2009

С точки зрения дизайна задумывались ли вы о создании системы, предназначенной для обработки пользовательской информации и аутентификации. Затем подключите другие приложения к этой системе через безопасный API, скорее всего, внутренний. Вы можете разделить базы данных и защитить базу данных пользователей, разрешив доступ только через API.

1 голос
/ 28 октября 2009

Короткий ответ: «Да». Конечно. Совместное использование пользовательской модели между приложениями принципиально не отличается от совместного использования любой модели другого между приложениями. Черт возьми, вы могли бы даже потянуть свои пользовательские данные через REST с ActiveResource, если не возражаете, что они будут немного медленными.

Но если Authlogic и подобные решения не являются ограниченным бизнес-ограничением, существуют другие способы обработки единого входа (SSO), кроме OpenID. Взгляните на RubyCAS , Castronaut (возможно, с Касабланка для клиента) или на совершенно другой подход Хэнкок .

0 голосов
/ 28 октября 2009

Лично мне не нравится OpenID, люди думают, что он немного безопаснее, чем есть.

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

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

Но есть способ указать модель для другой базы данных, я бы порекомендовал гем [текст ссылки] [1]. хотя он предназначен для совершенно другого использования, вы должны иметь возможность использовать его для указания каждого из ваших приложений на конкретную, другую базу данных для модели вашего пользователя.

[1]: http://github.com/fiveruns/data_fabric data_fabric

0 голосов
/ 27 октября 2009

Я думаю, что лучшим способом было бы внедрить систему OpenID .
Это позволит вашим пользователям проходить аутентификацию не только в ваших приложениях, но и почти везде, используя свои логин и пароль.

...