2012-04-19 1 views
2

Je voudrais limiter les utilisateurs uniquement pour afficher et modifier les données qui proviennent de leur appartement. J'ai enregistré leur apartment_id dans la session [: apartment_id]. Donc, j'ai CRUD, et je voudrais limiter les utilisateurs de ne pas être en mesure de faire/data/ID/modifier seulement pour changer l'ID, puis pour modifier les données. Existe-t-il un bon moyen de le faire, disons, à travers une certaine portée ou dois-je valider tout dans mon contrôleur dans chaque action. Merci d'avance. Dorijanruby ​​on rail limiter l'utilisateur seulement à des données spécifiques

modifier: ceci est plus détaillé: permet de dire il y a une liste d'utilisateurs quand faire/données et lorsque vous souhaitez voir les données spécifiques sur certains utilisateur ID vous iriez/données/ID exemple/données/27. Dans ma base de données, pour les données du modèle, j'ai la ligne apartment_id, qui indique dans quel appartement appartient cet utilisateur.

Maintenant, je veux limiter la vue pour certains utilisateurs en fonction de leurs données de session. Par exemple, lors de la connexion de l'utilisateur, il a la session [: apartment_id]. Donc, je veux pouvoir limiter l'accès par exemple/data/34 pour user_id = 34 qui a apartment_id différent de la session [: apartment_id].

En outre, lorsque l'utilisateur accède/données seulement pour montrer des utilisateurs de son apparent.

Je sais que je peux le faire dans chaque contrôleur, pour chaque méthode pour vérifier cela, mais puis-je le faire quelque part dans le modèle, pour être général? merci

+0

Sans savoir comment votre application est configurée, s'il existe une association entre les utilisateurs et leur appartement, vous pouvez vérifier que l'appartement qu'ils tentent de modifier appartient à leur utilisateur? – djlumley

+0

Quels modèles et relations avez-vous entre les utilisateurs et les appartements? – sarnold

+0

Ce railcast pourrait aider http://railscasts.com/episodes/1-caching-with-instance-variables –

Répondre

1

Si vos appartements has_many utilisateur, vous pouvez généralement le faire dans votre contrôleur:

def edit 
    current_user.apartments.find(params[:id]) 
end 

Ce ne trouvera que des appartements qui appartiennent à l'utilisateur actuel.

MISE À JOUR

semble que vous ne disposez pas d'un objet current_user ... donc:

def edit 
    @apartment = Apartment.find(params[:id]) 
    redirect_to root_path, error: "You do not have access for this apartment" 
end 
+0

merci pour votre réponse, mais je veux dire quelque chose d'autre. J'ai eu comme ceci: @client = Client.find (params [: id]), mais je veux limiter l'édition de ces données si Client.apartment_id! = Session [: apartment_id] – user899119

+0

hmm. D'accord. édité la réponse. –

2

Ajout au niveau des lignes de sécurité à votre application Rails Si vous construisez une application web avec une base de données, vous voudrez peut-être plus d'un utilisateur, ce qui signifie l'ajout de niveau ligne sécurité et authentification. Rails aide avec une pierre précieuse appelée Devise. Devise crée une table et des vues utilisateur pour s'authentifier dans l'application Web avec une session, puis vous pouvez ajouter une authentification à chaque vue pour vous assurer que vous disposez d'une session valide pour voir cette vue.

Tout est bien et dandy mais ne résout pas mon autre problème, qui est de restreindre les données dans la base de données par l'utilisateur. J'ai donc choisi d'utiliser le modèle Devise User, en particulier le champ id, et modifié par d'autres tables de base de données pour inclure le champ id (je l'ai appelé user_id). Tout cela fonctionne lorsque vous modifiez le reste de l'application Rails comme les appels de modèle pour utiliser la session user_id dans le cadre de chaque requête SQL. Permettez-moi de vous expliquer les étapes de base, qui comportent quelques détails, mais vous devrez improviser pour votre cas. À mon avis, le processus est divisé en étapes spécifiques à la devise et en étapes de sécurité au niveau de la ligne.

Concevoir des étapes

Ajout Legs aux vos Rails projet

add devise gem to gem file 

    gem ‘devise’ 

    bundle install 



rails generate devise:install 

(installs concevoir dans des rails app - être dans le répertoire racine de l'application)

rails g devise:views 

(étape optionnelle: ceci copie des vues ainsi nous pouvons customiser et modèle)

rails generate devise User 

(crée le modèle utilisateur)

bundle exec rake db:migrate 

(crée la table - notez que vous devez disposer de privilèges dans le YML de modifier la structure de base de données)

Restant Devise-lié étapes

Ajouter un top div à application.html.erb vérifier si l'utilisateur est connecté ou non, et montrer l'identifiant de connexion ou le nouvel utilisateur et le lien de connexion

créé un contrôleur 'invité' et afficher pour afficher quand il n'est pas connecté - également mis à jour routes.rb pour en faire la racine - ie, la première fois que quelqu'un va sur votre site, vous devriez les prendre à l'invité contrôleur, pas les données! Vous n'avez pas encore de session.

mis à jour le contrôleur invité/racine, en particulier, l'action d'index pour aller connecté contrôleur si l'utilisateur est connecté

if user_signed_in? 

    redirect_to :controller=>’home’, :action=> ‘index’ 

    end 

Dans tous les autres contrôleurs de données/loggedin, ajoutez ce qui suit au sommet du contrôleur avant les actions: Ceci garantira que personne ne peut utiliser les chemins d'URL pour atterrir sur une page sans être authentifié.

before_filter :authenticate_user! 

niveau ligne étapes

modifier les tables où vous voulez la sécurité de niveau ligne « RLS » avec colonne user_id.

mysql> ALTER TABLE mytable ADD COLUMN user_id VARCHAR(255) AFTER id; 

Mettez à jour les tables avec une user_id valable à partir du tableau des utilisateurs (cela suppose que vous avez déjà créé un utilisateur avec le formulaire d'inscription. Ou tout simplement utiliser 1, car il semble Devise commence le premier ID utilisateur à 1)

mysql> UPDATE mytable SET user_id = (SELECT id FROM users WHERE email = ‘[email protected]’); 

Poignée ajoutant de user_id à la table insère

en données/contrôleur de loggedin action Créer, mettre à jour le champ user_id dans l'objet de paramètre.

def create 

params[:mytable][:user_id] = current_user.id 

… 

end 

poignée sélectionne/requêtes en passant user_id comme paramètre

Dans un modèle de données/loggedin, passent user_id dans une nouvelle mon champ d'interrogation, puis combiner ce nouveau champ d'application avec d'autres champs d'application (en vous assurant de passer id_utilisateur dans les autres champs d'application, il y a d'autres façons de le faire, mais j'aime les étendues):

scope :my, -> (user_id) { where(“user_id = ?”, user_id) } 

scope :mylovelyquery, -> (user_id) { my(user_id).where(:mylovelyselectioncriteria=>”A”).order(“mysortfield”) } 

Dans les données/connectés contrôleurs, action index de changement pour obtenir current_user.id et le transmettre à la ActiveRecord scopes vous avez créé . Cette étape est fastidieuse et pourrait être faite souvent - recherchez des index de contrôleur ou n'importe quelle action de contrôleur faisant un SELET - qui ont besoin de RLS! Ceci s'applique également aux appels Ajax.

def index 

@user_id = current_user.id 

@mytables = Mytable.my(@user_id).order(mylovelysortfield DESC”) 

end 

Leçons apprises

Probablement la seule chose qui me raccrocha le plus oubliais pour obtenir le current_user.id, avant de faire une récupération de la base de données.

Questions connexes