0

J'ai deux applications RoR3:conditionnelle 'attr_accessible' en utilisant ActiveResource en Ruby on Rails

  • http://users.domain.local
  • http://profiles.domain.local

J'ai créé les 'utilisateurs/modèles/profile.rb':

class Profile < ActiveResource::Base 
    self.site = "http://profiles.domain.local" 
end 

Dans 'profiles/models/profile.rb' J'ai:

attr_accessible :name 

Mon profil de table SQL contient ces colonnes:

  • id
  • Nom
  • user_id

Donc, si je lance Profile.create(:name => "test_name") un nouveau profil sera créé en http://profiles.domain.local avec le nom "test_name". Pour des raisons évidentes de sécurité, je ne veux pas rendre accessible l'attribut 'user_id', mais je dois le définir sur la création de profil à partir de l'application 'users'.

J'ai essayé beaucoup de faire cela, mais je ne trouve pas de solution facile. Peut-être, il est possible avec une instruction if près du 'attr_accessible' de l'application 'profile' qui remplit une requête de l'application 'user'.

Quelqu'un peut-il m'aider?

Répondre

1

Vous pouvez essayer quelque chose comme Amazon Web Services: utilisez une clé générée aléatoirement à chaque requête. Vérifiez que la clé est correcte dans votre application de profils, et si oui, mettez à jour l'attribut.

+0

Êtes-vous sûr qu'Amazon utilise cette approche? Je sonne un peu "hackerable" ... Quoi qu'il en soit, je dois d'abord communiquer la clé de l'application "profils" puis les comparer. Tout au long de 'NET: HTTP' Demande GET? Est-ce la bonne façon? – user502052

+0

La façon dont Amazon, Google, etc. le font: ils vous donnent une clé API, qui est essentiellement une longue chaîne de caractères aléatoires. La façon dont il est utilisé est comme un mot de passe: l'application 'profiles' l'envoie à l'application' users' (soit sur chaque requête, soit au début de chaque session). Sur 'profiles', la clé API sera généralement codée en dur ou dans un fichier de configuration. 'Users' vérifiera alors que la clé de l'API est valide, correspond à votre compte et est autorisée à effectuer l'action que vous demandez. N'oubliez pas d'utiliser SSL si vous envoyez des informations sensibles sur des réseaux non fiables. –

+0

Dans ce cas, je n'ai pas besoin de SSL, mais pour les autres j'ai besoin de ça. Cependant, j'ai beaucoup de problèmes, tout en utilisant ActiveResource Class (un de mon problème: http://stackoverflow.com/questions/4653006/full-example-on-using-activeresource-with-a-certificate-authentication) – user502052

0

Solution: N'utilisez pas simplement Profile.create, utilisez plutôt les générateurs d'association. Protégez l'attribut user_id et utilisez user.profiles.create!(params[:profile]) pour qu'il définisse automatiquement le champ user_id pour les profils, quel que soit l'objet user.

+0

'Profile.create! (: User_id =>' 34 ')' J'obtiens une méthode non définie 'create! ' pour le profil: erreur de classe ". 'Profile.create (: user_id =>' 34 ')' fonctionne, mais rien à voir avec ': user_id'! – user502052

+0

Peut-être que je me trompe avec les constructeurs d'associations ... pouvez-vous me donner un exemple basé sur les données que j'ai fournies en question? – user502052

+0

Dommage, il semblerait que 'Profile' ne soit pas une classe ActiveRecord comme je le pensais. –

Questions connexes