convalida forza di password vuote in Authlogic
-
24-09-2019 - |
Domanda
Sono l'aggiunta di una funzione di ripristino della password per la mia applicazione Rails che utilizza Authlogic. Stavo seguendo qui la guida: http: // www .binarylogic.com / 2008/11/16 / Tutorial-reset-password-con-Authlogic / e tutto funziona come vorrei tranne per una cosa: il modulo di reimpostazione della password accetta password vuote e semplicemente non lo fa cambiarli.
Ho cercato in giro, e hanno imparato che questo è il comportamento di default previsto perché permette di fare modificare all'utente forme che cambiano solo la password dell'utente se entrano uno nuovo, e ignorare altrimenti. Ma in questo caso, io in particolare voglio far rispettare la convalida della password come quando un utente si registra inizialmente. Ho trovato due soluzioni possibili per questo problema, ma non sono stati in grado di capire come implementare una di esse.
1) Qualcuno ha chiesto questa stessa domanda su Google Gruppi:
La risposta di Ben è stato quello di utilizzare @user.validate_password = true
alla validazione forza della password. Ho provato questo ma ho un errore metodo non definito:. undefined method 'validate_password_field=' for #<User>
2) Sembra che ci sia una possibilità di configurazione Authlogic chiamato ignore_blank_passwords
. È documentato qui:
Modulo: Authlogic :: ActsAsAuthentic :: password :: Config # ignore_blank_passwords
Questo appare come avrebbe funzionato, ma la mia comprensione è che si tratta di un'opzione di configurazione globale che si utilizza nella vostra chiamata acts_as_authentic
iniziale nel modello User, e non voglio cambiarlo a livello di applicazione, come faccio io avere una forma di modifica regolare per gli utenti dove voglio password vuote per essere ignorati per impostazione predefinita.
Chiunque ha trovato una soluzione a questo? Vedo validate_password=
nel registro delle modifiche per Authlogic 1.4.1 e nulla su di esso essendo stato rimosso da allora. Sto semplicemente usando in modo errato? C'è un modo per utilizzare ignore_blank_passwords
su una base per-request?
Soluzione
Questo quello che ho fatto.
class User < ActiveRecord::Base
attr_accessor :ignore_blank_passwords
# object level attribute overrides the config level
# attribute
def ignore_blank_passwords?
ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true)
end
end
Ora nel controller, impostare l'attributo ignore_blank_passwords
su false.
user.ignore_blank_passwords = false
Qui, si sta lavorando all'interno dei confini di Authlogic. Non è necessario cambiare la logica di convalida.
Altri suggerimenti
Questa è una specie di un vecchio thread, ma dal momento che è senza risposta vi posterò questo.
sono riuscito a farlo un po 'più pulito rispetto alle altre soluzioni, "aiutare" le convalide Authlogic con la mia.
Ho aggiunto questo per utente:
class User < ActiveRecord::Base
...
attr_writer :password_required
validates_presence_of :password, :if => :password_required?
def password_required?
@password_required
end
...
end
È possibile ridurre a due linee di fare attr_accessor
e utilizzando :if => :password_required
(senza interrogatori), ma preferisco questo altro sintassi con il segno di interrogazione.
Allora la vostra azione di controllo può essere fatto in questo modo:
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
@user.password_required = true
if @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
Ciò avrà un effetto locale; il resto della domanda non sarà influenzato (a meno che non password_required
è impostata su true in altri luoghi, che è).
Spero che aiuta.
User.ignore_blank_passwords = false
Usa modello, non oggetto per impostare questa proprietà.
def update_passwords
User.ignore_blank_passwords = false
if @user.update_attributes(params[:user])
...
end
User.ignore_blank_passwords = true
end
Forse verificare il valore del parametro nel regolatore? (Codice d'aria):
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
if @user.password.blank?
flash[:error] = "Password cannot be blank"
render :action => :edit
return
end
if @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
A parte la soluzione di Zetetic si potrebbe fare in questo modo:
def update
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][: password_confirmation]
if @user.changed? && @user.save
flash[:notice] = "Password successfully updated"
redirect_to account_url
else
render :action => :edit
end
end
Si sta controllando se fondamentalmente Authlogic cambiato il record utente (che non è così se la password è vuota). Nel blocco il resto si può verificare se la password era vuoto e aggiunge un messaggio di errore appropriato al record utente o visualizzazione di un messaggio flash.