1つのデータベースでユーザーを認証する、Authlogicを使用する複数のアプリケーション?
-
06-07-2019 - |
質問
Googleグループで質問が何度か聞かれましたが、答えや解決策をフォローアップしている人はいないようです。 Authlogic?
今すぐOpenIDを使用することはできません。好きですが、クライアントはそれをサポートしていませんまだ。
解決
元の質問に対する解決策がまだ投稿されていないようです。
同様の問題がありました。複数のRailsアプリケーションがあり、それらすべてのアクティビティ間でユーザーを追跡できるようにする必要がありました。そのため、ユーザーの管理と追跡用の単一のアプリケーションが必要であり、他のすべてのアプリケーションはこのユーザーデータベースに接続して認証を行いました。
すでに他のプロジェクトで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などの独自のサブドメインの下にあります これが他の変更なしで機能するかどうかはわかりません。
各アプリケーションで、UserSessionを作成します
class UserSession < Authlogic::Session::Base
end
およびユーザーモデル。
class User < ActiveRecord::Base
establish_connection "users_database"
acts_as_authentic
end
このユーザーモデルの違いは、接続方法を確立することです。 &quot; users_database&quot; 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'を使用できます。
これが役立つことを願っています。
チェイスMグレー
他のヒント
設計の観点から、ユーザー情報と認証の処理専用のシステムを作成することを考えましたか。次に、他のアプリケーションを、おそらく内部のセキュアAPIを介してそのシステムに接続します。 APIを介したアクセスのみを許可することにより、データベースを分離し、ユーザーデータベースを安全に保つことができます。
短い答えは「はい」です。はい。アプリケーション間でユーザーモデルを共有することは、アプリケーション間で他のタイプのモデルを共有することと基本的に違いはありません。ちょっと遅いかもしれませんが、ActiveResourceを使用してREST経由でユーザーデータをプルすることもできます。
しかし、Authlogicやそのようなソリューションがロックされたビジネス上の制約でない場合、OpenIDだけでなくSSO(シングルサインオン)を処理する他の方法があります。 RubyCAS 、宇宙飛行士( Casablanca はクライアント用)、またはまったく異なるアプローチ用、ハンコック。
OpenID システムを実装するのが最善の方法だと思います。
これにより、ユーザーはアプリケーションだけでなく、ログインとパスワードを使用してほぼどこでも認証できます。
個人的にOpenIDは好きではありませんが、人々はOpenIDがそれよりも少し安全だと思う傾向があります。
あなたの質問については、それができない理由は見当たりません、セキュリティに特別な注意を払う必要があります(ユーザーは、許可されたアプリ/ドメインにのみログインできます)例)。
唯一の問題は、アプリ間で1つのテーブルしか共有できないことです。デフォルトでは、すべてのアプリに同じデータベースを使用する必要があります。
しかし、モデルを別のデータベースにポイントする方法はあります。[link text] [1] gemをお勧めします。完全に異なる使用法を意図していますが、それを使用して、各アプリがユーザーのモデル用の特定の異なるデータベースを指すようにする必要があります。
[1]: http://github.com/fiveruns/data_fabric data_fabric