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.
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
Quels modèles et relations avez-vous entre les utilisateurs et les appartements? – sarnold
Ce railcast pourrait aider http://railscasts.com/episodes/1-caching-with-instance-variables –