Plusieurs applications utilisant Authlogic, authentifiant les utilisateurs dans une base de données?

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

  •  06-07-2019
  •  | 
  •  

Question

J'ai vu la question posée à quelques reprises sur les groupes Google, mais personne ne semble suivre une réponse ou une solution .. Est-il possible d'utiliser une base de données centrale pour la création d'utilisateurs et l'authentification à partir de plusieurs applications Rails à l'aide de Authlogic?

Ce n’est pas une option pour moi d’utiliser OpenID pour le moment, mais le client ne le prend pas en charge pour le moment .

.

Était-ce utile?

La solution

Il semble qu’aucune solution n’ait encore été postée à la question initiale.

J'ai eu un problème similaire. J'avais plusieurs applications de rails et j'avais besoin de pouvoir suivre les utilisateurs d'une activité à l'autre. Donc, je voulais avoir une seule application pour gérer les utilisateurs et le suivi et toutes les autres applications se connecteraient à cette base de données d'utilisateurs pour s'authentifier.

J'utilisais déjà Authlogic pour d'autres projets. J'espérais donc que ce serait aussi simple que de modifier certains paramètres de configuration.

Voici ma solution:

J'ai créé l'application de suivi des utilisateurs principale. L'application n'avait rien de spécial. Il permettait aux utilisateurs de s'inscrire, de se connecter, de se déconnecter, etc. Une fois les utilisateurs connectés, ils pouvaient accéder aux autres applications.

Dans le fichier environnements.rb de mon application utilisateur et de chaque application devant s'authentifier auprès de l'application de base, vous devez configurer la clé de session et le domaine pour qu'ils soient identiques.

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

Chacune de mes applications se trouve dans son propre sous-domaine, tel que app1.basedomain.com app2.basedomain.com Je ne sais pas si cela fonctionnerait autrement sans quelques modifications supplémentaires.

Dans chaque application, créez la UserSession

class UserSession < Authlogic::Session::Base   
end

et les modèles utilisateur.

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

Ce qui est différent dans ce modèle d’utilisateur, c’est qu’il utilise maintenant la méthode d’établissement de connexion. la " users_database " se trouve dans le fichier database.yml et pointe vers la base de données de l'application de gestion d'utilisateurs centrale.

Je ne suis pas allé jusqu'à avoir une connexion et une déconnexion dans mes sous-applications, mais si vous le deviez, vous auriez également à créer le UserSessionsController.

Dans chaque application utilisant l'authentification, j'ai inclus des méthodes d'assistance dans ApplicationController, par exemple,

.
   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

Ensuite, je peux utiliser "require_user" dans mes contrôleurs pour lesquels je souhaite une authentification, comme dans mon application utilisateur principale.

J'espère que ça aide.

Chase M Gray

Autres conseils

Du point de vue de la conception, avez-vous pensé à créer un système dédié à la gestion des informations utilisateur et à l’authentification. Ensuite, laissez vos autres applications se connecter à ce système via une API sécurisée, très probablement interne. Vous pouvez séparer vos bases de données et sécuriser la base de données utilisateur en autorisant uniquement l'accès via l'API.

La réponse courte est "Oui". Sûr. Le partage d'un modèle d'utilisateur entre des applications n'est pas fondamentalement différent du partage d'un autre type de modèle entre les applications. Heck, vous pouvez même potentiellement extraire vos données utilisateur via REST avec ActiveResource si cela ne vous dérange pas que cela soit un peu lent.

Toutefois, si Authlogic et des solutions telles que celle-ci ne constituent pas une contrainte métier figée, il existe d'autres moyens de gérer la connexion unique (SSO) que la seule OpenID. Consultez RubyCAS , Castronaute (peut-être avec Casablanca pour un client), ou pour une approche totalement différente , Hancock .

Je pense que la meilleure façon de mettre en œuvre un système OpenID est la solution.
Cela permettrait à vos utilisateurs de s'authentifier non seulement sur vos applications, mais presque n'importe où avec leur identifiant et leur mot de passe.

Personnellement, je n’aime pas OpenID, les gens ont tendance à penser que c’est un peu plus sécurisé qu’il ne l’est.

En ce qui concerne votre question, je ne vois aucune raison de ne pas pouvoir faire cela, mais vous devrez redoubler de prudence en matière de sécurité (l'utilisateur ne peut se connecter qu'à l'application / au domaine pour lequel il est autorisé. ex).

Le seul problème que je vois est que vous ne pouvez pas partager une seule table entre les applications. Par défaut, vous devez utiliser la même base de données pour toutes vos applications, un no-no.

Mais, il existe un moyen de faire pointer un modèle sur une autre base de données, je recommanderais le [lien texte] [1] bijou. bien qu'il soit destiné à un usage complètement différent, vous devriez pouvoir l'utiliser pour diriger chacune de vos applications vers une base de données spécifique différente pour le modèle de votre utilisateur.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top