Несколько приложений, использующих Authlogic, аутентифицирующих пользователей в одной базе данных?

StackOverflow https://stackoverflow.com/questions/1631586

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Я уже использовал 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

Отличительной особенностью этой модели User является то, что теперь она имеет метод установления соединения. " база_пользователей " находится в файле 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' в моих контроллерах, где я хочу аутентификацию, как и в моем основном пользовательском приложении.

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

Чейз М Грей

Другие советы

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top