Несколько приложений, использующих Authlogic, аутентифицирующих пользователей в одной базе данных?
-
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