2013-04-07 10 views
6

Ich entwickle eine App mit Rails und Devise für die Benutzerauthentifizierung. Ich frage mich, ob es eine Möglichkeit gibt, das Passwort nur für einige Änderungen zu fragen.Devise: Passwort nur für bestimmte Situationen fragen

Zum Beispiel möchte ich das Passwort gefragt werden, wenn:

  • das Konto löschen
  • Passwort ändern

Und ich möchte der Benutzer frei sein, andere Felder zu bearbeiten, ohne jedes Passwort, wie zum Beispiel:

  • Namen
  • Benutzername
  • Avatar

Also, würde ich einen Weg, wie zwischen diesen beiden Methoden zu tauschen. Wie kann ich das lösen?

EDIT:

In Devise in der Dokumentation ich diese gefunden und es funktioniert gut, es erlaubt das Ändern nur Passwort und E-Mail, wenn ich das Passwort eingeben:

def update 
    @user = User.find(current_user.id) 

    successfully_updated = if needs_password?(@user, params) 
     @user.update_with_password(params[:user]) 
    else 
     # remove the virtual current_password attribute update_without_password 
     # doesn't know how to ignore it 
     params[:user].delete(:current_password) 
     @user.update_without_password(params[:user]) 
    end 

    if successfully_updated 
     set_flash_message :notice, :updated 
     # Sign in the user bypassing validation in case his password changed 
     sign_in @user, :bypass => true 
     redirect_to after_update_path_for(@user) 
    else 
     render "edit" 
    end 

end 

private 

# check if we need password to update user data 
# ie if password or email was changed 
# extend this as needed 
def needs_password?(user, params) 
    user.email != params[:user][:email] || 
    !params[:user][:password].blank? 
    #HERE 
end 

Nun, was ich in #HERE setzen könnte benötigen Sie auch das Passwort, wenn ich das Konto lösche?

+0

Sie können nichts '#HIER' hinzufügen, da die' update' Methode den Benutzer nicht löscht, sondern nur Benutzerattribute aktualisiert. Sie können die gleiche Art von Sachen hinzufügen, um 'Methode 'in Ihrem Controller – ted

Antwort

0

Sie könnten eine form_tag Umleitung zu einer Aktion in Ihrem Controller erstellen.

<%= form_tag url_for(:controller => :users, :action => :destroy), :method => :get do %> 
    <%= label_tag(:password, "Enter password before deleting") %> 
    <%= password_field_tag :password %> 
    <%= submit_tag "Delete User With Confirmation" %> 
<% end %> 

Die Aktion in Ihrem Userscontroller sei so etwas wie:

def destroy 
    if current_user.authenticate(params[:password]) 
     #do something 
    else 
     #do something 
    end 
end 
3

aufgrund Frage bearbeiten:

def destroy 
    if current_user.valid_password?(params[:user][:password]) 
    current_user.destroy 
    else 
    render "destroy" # or what ever 
    end 
end 
+0

zu zerstören, die nicht nach dem Passwort fragt, ist es? – Zippie

+0

@Zippie, "Diese Methode stellt sicher, dass der Benutzer angemeldet ist und leitet sie nicht auf die Anmeldeseite weiter", Quelle: http://asciicasts.com/episodes/210-customizing-devise – ted

+0

Fran schrieb: "Ich frage mich, ob Es gibt eine Möglichkeit, das Passwort nur für einige Änderungen zu fragen. " – Zippie

0

Es gibt eine destroy_with_password Methode in Devise (mindestens ab Version 3.5. 2). Es ist in lib/devise/models/database_authenticatable.rb und wird von

destroy_with_password(current_password) 

Es zerstört den Datensatz, wenn die current_password einstimmt, und gibt andernfalls false genannt.

Verwandte Themen