2009-10-05 8 views
0

Je travaille sur une application Rails qui nécessite des permissions basées sur les rôles (appelons l'application "Caché"), mais l'application ne traitera pas l'authentification des utilisateurs. L'application principale définit un cookie crypté et l'application cachée l'utilise comme preuve d'authentification.Modèle de délégué pour la base de données distante Rails?

L'application masquée doit implémenter une variété de rôles; administrateur, gestionnaire de projet, éditeur, etc. J'utilise un authorization plug dans lequel crée une table roles et une table users_roles et utilise les relations has_many entre la table utilisateur et la table de rôles en utilisant une table users_roles. Toutes les jolies choses de vanille jusqu'ici. Le problème est que l'application principale a déjà une table userset une table users_roles. J'ai un modèle Main :: User qui utilise la base de données principale de l'application (création d'une connexion personnalisée), mais en essayant de tirer parti de l'infrastructure d'autorisation en créant un rôle, l'opération échoue car ActiveRecord utilise les informations de connexion de Main :: User table, qui tente de mettre à jour les tables users_roles dans l'application principale (ce qui n'est pas autorisé). J'ai même essayé de supprimer la spécification habtm et d'utiliser la macro has_many avec l'option: through pour spécifier la table de jointure, mais ActiveRecord utilise toujours la base de données principale car la connexion est configurée via le modèle Main :: User. L'étape suivante consistait à implémenter la Rails Recipe 15 "Connecting to Multiple Database", mais la partie qui me manque est comment rendre mon modèle de référence local, UsersReference, référence automatiquement la table users de l'application principale. La recette mentionne: «Cette solution exigerait, bien sûr, que les lignes nécessaires soient créées dans la table product_references pour correspondre à tous les produits que nous avons dans la base de données alternative, soit dans le lot , soit automatiquement lors de l'exécution. Je préfère ne pas avoir à conserver deux copies - il y a plus de 425 000 utilisateurs et leur statut change tout le temps, donc l'idée de faire des mises à jour par lots n'est pas très acceptable.

Idéalement, je voudrais que le modèle UsersReference de la recette agisse en tant que délégué au tableau users. J'imagine que cela impliquerait d'obtenir automatiquement les lignes de la table users lors de l'exécution, comme décrit dans la recette. Est-ce que quelqu'un a de l'expérience à faire ceci ou quelque chose comme ça? J'apprécierais grandement vos pensées.

Répondre

0

Je l'ai résolu jusqu'à présent en supprimant le modèle UsersReference et en créant un modèle Users dans l'application Cachée. J'ai défini User.find_user, qui vérifie si l'ID utilisateur est dans la table locale. Si ce n'est pas le cas, l'utilisateur l'extrait du modèle Main :: User et l'enregistre localement. Le modèle d'utilisateur caché est celui utilisé pour l'autorisation, qui répond aux besoins du plugin d'autorisation. La dernière chose que je voudrais est de cacher la méthode User.find afin qu'elle ne puisse pas être appelée accidentellement, mais créer un self.find (* arg) et rendre ce protégé ou privé ne fonctionnait pas - User.find était encore appelable.

Questions connexes