2010-10-16 4 views
0

pour voir s'il y a des idées sur la façon dont je devrais introduire l'idée d'un «utilisateur» connecté de manière efficace fédère les données ... laissez-moi vous expliquer.Comment ajouter un modèle utilisateur à mon application afin que les données soient spécifiques à l'utilisateur dans mon application Rails

J'ai construit mon application jusqu'à présent, comme s'il n'y avait qu'un seul utilisateur. Moi. Toutes les données et les rapports sont spécifiques à moi. Je viens d'ajouter "authlogic".

Je veux maintenant être en mesure d'introduire un moyen pour un nouvel utilisateur de se connecter, de ne voir aucune de mes données, et d'utiliser l'application. Et éventuellement payer pour utiliser le système. Jusqu'à présent, mon hypothèse est que je devrais aller dans les modèles et ajouter un user_id à peu près chacun d'entre eux, puis aller à tous les contrôleurs et les faire rechercher par l'utilisateur. Mais je me demande s'il y a des gemmes, des suggestions, des idées d'un meilleur moyen de fédérer les données pour chaque utilisateur.

Oh ... Je voudrais permettre à plus d'un utilisateur d'avoir accès à tout ou partie des données appartenant à un autre utilisateur. C'est pour les petites équipes de vendeurs qui peuvent vouloir partager.

Alors ... des idées avant d'essayer tâtonner autour de moi ... merci :)

Répondre

2

Vous avez la bonne idée. Vous devez établir des relations entre les utilisateurs et les modèles de données. Dans certains cas, il peut s'agir d'un simple belongs_to :user, mais si vous voulez que plusieurs utilisateurs aient accès à certaines données, il faudra que ce soit une relation plusieurs-à-plusieurs has_and_belongs_to_many :users.

Ensuite, nous changeons simplement la façon dont nous récupérons les données:

# Some controller, no restrictions 
def index 
    @reports = Report.all 
end 

def view 
    @report = Report.find(params[:id]) 
end 

# Some controller, with restrictuons 
def index 
    @reports = current_user.reports.all 
end 

def view 
    @report = current_user.reports.find(params[:id]) 
end 

En utilisant la logique ci-dessus, les utilisateurs ne voient que toutes les données qu'ils ont une relation.

Si vous avez déjà créé la plupart des applications, cela va sans doute être un peu plus difficile. Ce que vous devez être vraiment, vraiment vraiment prudent avec ne laissant aucun Report.all ou Report.find(params[:id]) qui traînent, car cela peut conduire à des vulnérabilités - les utilisateurs seraient en mesure d'accéder aux données qui ne sont pas réellement les leurs.

+0

soupir - merci pour les spécificités du code, c'est ce que je cherchais ... en espérant trouver une balle d'argent, mais c'est cool .... – Angela

+0

L'utilisateur a-t-il aussi has_many pour * tous * les objets ou devrais-je essayer trouver un moyen de trouver un seul objet de premier niveau? Semble plus de travail pour faire chaque objet, mais probablement plus sécurisé? – Angela

0

Qu'est-ce que vous parlez est appelé ACL (listes de contrôle d'accès). Il y a un certain nombre de plugins pour Rails qui feront le gros du travail pour vous. Google autour et voir si vous pouvez en trouver un qui correspond à vos besoins. Edit: Après un coup d'oeil, Acl9 semble être le plus populaire compatible Rails 3.

+0

Pas ... vraiment. ACL a plus à voir avec la restriction de l'accès à certaines parties du système, ou des contrôleurs/actions dans Rails-speak. Pensez que «l'utilisateur 1 est un administrateur et peut afficher, modifier et supprimer d'autres utilisateurs», tandis que «l'utilisateur 2 peut lister les autres utilisateurs sans les modifier» et «l'utilisateur 3 ne peut même pas voir la liste des utilisateurs». D'autre part, Angela veut que tous les utilisateurs puissent accéder aux mêmes contrôleurs et actions, mais visualiser des données différentes. – vonconrad

+0

c'est vrai - veulent les mêmes contrôleurs et actions, mais des données différentes. – Angela

+0

Ah, d'accord. Je sais ce qu'est ACL, j'ai juste mal interprété ce qu'elle demandait. –

Questions connexes