8
votes

Ruby sur rails / congiser - nécessitant un mot de passe sur le changement de courrier électronique

Ceci est-il, pour toutes les billes, si je peux obtenir ce problème résolu, j'ai un projet terminé.

De toute façon, j'utilise Ruby sur Rails 3 avec le congé pour l'authentification de l'utilisateur. Comme vous le savez peut-être, dans l'utilisateur Admin / Modifier par défaut, un utilisateur doit entrer son mot de passe actuel dans le champ actuel_password s'il fournit un nouveau mot de passe. Il y a une tonne d'informations sur la manière de désactiver la désactivation de courant_password afin que les utilisateurs puissent changer et sauver librement. P>

Cependant, je peux trouver très peu en faisant le contraire: nécessitant le mot de passe actuel pour plus de champs ... Dans mon cas, le champ email. Et ne nécessite que le mot de passe actuel lorsque cet e-mail Addy est modifié, non si elle reste la même. Actuellement, les utilisateurs peuvent changer librement de leur email sans donner leur mot de passe actuel et pour des raisons de sécurité, je ne le veux pas. P>

Après avoir regardé à travers le Devise Wiki, j'ai trouvé Cette page et je Je pensais que je pourrais inverser ce code pour compléter cette solution. J'ai réussi à travailler ce modèle de mon utilisateur.rb (je suis dépassé de la logique inutile de ce post) .... p> xxx pré>

it "presque" fonctionne "presque" . Si je sauvegardez le profil d'utilisateur en changeant rien, ou modifiez d'autres champs obligatoires sans mot de passe (comme l'utilisateur avatar), le profil enregistre une amende, aucun mot de passe requis. Jusqu'à présent, si bon. P>

et si je modifie l'adresse e-mail, la validation est em> déclenchée ... mais ce qui se passe est que le mot de passe actuel_pass. ) Les champs déclenchent selon les besoins. Et si je remplis le mot de passe dans les trois (mot de passe, mot de passe_confirmation, actuel_password) juste pour l'enfer, il ne faudra pas, donne simplement une erreur de validation. P>

Fondamentalement, seul le motwutword ne devrait être requis si l'adresse e-mail est modifiée. Comment ferais-je ce travail dans mon code? P>

  • Mise à jour ******* LI> ul>

    J'ai vérifié mon journal en réponse à la suggestion ci-dessous par BowserSenior et que vous voyez les lignes suivantes lorsque j'essaie de sauvegarder et de mettre à jour l'e-mail ... P>

    User Load (0.2ms)  SELECT `users`.`id` FROM `users` WHERE (LOWER(`users`.`email`) = LOWER('newaddress@changed.com')) AND (`users`.id <> 1) LIMIT 1
      User Load (0.2ms)  SELECT `users`.`id` FROM `users` WHERE (`users`.`name` = BINARY 'Administrator') AND (`users`.id <> 1) LIMIT 1
      SQL (0.1ms)  ROLLBACK
    


0 commentaires

3 Réponses :


5
votes

Essayez-le:

validates :current_password, :presence => TRUE, :if => :email_changed?


6 commentaires

Plus près encore, mais pas tout à fait là-bas. Maintenant, il vomit une erreur sur le champ de mot de passe actuel - si elle n'est pas remplie - mais ce qui est étrange, c'est que même si vous remplissez le mot de passe correct, il accueille un autre "mot de passe actuel ne peut pas être vide" Erreur ... qui est étrange.


J'ai remarqué quelque chose d'intéressant dans mon fichier journal que je ne peux pas interpréter actuellement, je l'ai posté à la suite de mon poste d'origine ci-dessus.


Je pense que je sais ce qui se passe. Votre modèle ne permet pas d'autoriser : actuel_password pour être défini car vous protège contre la masse d'affectation en utilisant attr_accestible . Essayez d'ajouter : actuel_password dans la liste des champs suivants attr_accesible . Je ne peux pas vous dire combien de fois j'ai été mordu par ce problème!


J'avais soupçonné que je ne voyais pas que le message "NE PAS À Mettre à jour la masse" (ou si elle lit). J'ai essayé d'ajouter actuel_password dans attr_accesible, mais cela ne l'aura toujours pas. Je soupçonne que "SELECT .... Où (plus bas ..." Essayant de sélectionner la nouvelle adresse e-mail avant que l'enregistrement ne soit sauvegardé de l'enregistrement. Qu'est-ce que curieux est si je supprime la logique et le faire fonctionner comme Normal, aucune sélection n'est tentée avant que l'enregistrement soit enregistré.


Nevermind, je pense Je l'ai résolu. J'ai oublié de mentionner que j'ai défini un utilisateur séparé_controller (en dehors de Devise) afin que je puisse avoir une section d'administration de profil séparé pour que les utilisateurs modifient leur propre profil - en dehors de l'administrateur utilisateur par défaut de Devise (destiné aux utilisateurs de l'administrateur / du personnel). Fondamentalement, il y avait quelque chose dans les utilisateurs_controller qui supprimait actuellement_password si le mot de passe était vide, une histoire longue courte, elle interfère. La réponse de BowserSenior est donc bien correcte. Merci beaucoup.


Heureux que vous ayez eu le problème résolu. Une note: dans mon expérience, des bogues d'affectation de masse ont tendance à être invisibles, vous devez donc être très prudent. Accept_neDe_attributes_for provoque des maux de tête similaires.



4
votes

Je crois que le moyen de faire cela est le suivant:

devise_for :users, :controllers => { :registrations => "registrations" }


0 commentaires

1
votes

Semblable à la réponse de Pawel, mais plutôt que de remplacer la mise à jour de la méthode du contrôleur, que diriez-la de cela, basé sur le Devise wiki xxx


0 commentaires