Sto trasferendo un progetto da Rails 3 a 3.1. Il mio sistema di autenticazione è stato facilmente trasferito alla nuova has_secure_password in ActiveRecord. L'unico problema che sto incontrando è che utilizzo anche OmniAuth e ho il sistema configurato in modo tale che se un utente si iscrive usando uno dei provider OmniAuth l'account non dovrebbe richiedere una password. Non riesco a sovrascrivere l'impostazione di validazione password_digest di has_secure_password. Esiste comunque la possibilità di disattivare quelle convalide e scrivere le mie, o dovrò semplicemente usare le mie vecchie funzioni di bcrypt scritte dalla mia versione di Rails 3 del sito?Ottenere Rails has_secure_password 3.1 per funzionare bene con OmniAuth
risposta
Ho finito per tornare a utilizzare i metodi personalizzati. Tuttavia, mi sono reso conto in seguito che avrei dovuto essere in grado di utilizzare un callback before_validation per verificare le condizioni, quindi se corrispondevano impostare la password_digest su qualcosa di semplice come '0'. In questo modo il digest non sarebbe mai vuoto, ma allo stesso tempo non dovrebbe mai convalidare come password corretta, facendoli accedere tramite OmniAuth.
Sentitevi liberi di correggermi se mi sbaglio.
Scott, la tua idea è corretta. Sono stato wrestling con questo problema senza alcun risultato. Ho provato a sovrascrivere 'has_secure_password' e semplicemente non funzionerà. Non importa dove ho bloccato il codice.
Invece ho il seguente:
class User < ActiveRecord::Base
has_secure_password
validates_presence_of :password, :on => :create, :if => :password_required
# Associations
has_many :authentications
# Callbacks
before_validation :no_password_omniauth
# Gets set to true if the caller is trying to authenticate with omniauth.
@called_omniauth = false
# Build new omniauth users
def apply_omniauth(omniauth)
authentications.build(
:provider => omniauth['provider'],
:uid => omniauth['uid'])
self.first_name = omniauth['user_info']['first_name'] if self.first_name.blank?
self.last_name = omniauth['user_info']['last_name'] if self.last_name.blank?
self.email = omniauth['user_info']['email'] if omniauth['user_info']['email'] && self.email.blank?
@called_omniauth = true
end
def password_required
return false if @called_omniauth == true
(authentications.empty? || !password.blank?)
end
private
def no_password_omniauth
self.password_digest = 0 unless password_required
end
end
Il metodo apply_omniauth viene chiamato dal controller quando qualcuno sta cercando di autenticare o registrati.
Grazie per l'idea che l'hai inchiodato.
Ho cambiato la risposta alla tua poiché hai fornito un esempio di codice. Grazie. Suppongo quindi che non ti consentirebbe di accedere a quell'account utilizzando qualsiasi tipo di password? –
Inoltre, cosa stai usando '@ called_omniauth' per esattamente? Non userebbe semplicemente 'authentications.empty? || ! password.blank? nel metodo 'password_required' è sufficiente? –
called_omniauth è l'unico modo in cui la tua applicazione sa che l'utente sta registrandosi tramite omniauth (con il metodo apply_omniauth). – chourobin
- 1. Rails 3.1 Mongo has_secure_password
- 2. Rails Omniauth con proxy http in uscita
- 3. Come far funzionare i caratteri in Rails 3.1?
- 4. Capistrano per Rails 3.1
- 5. Cosa WYSIWYG funziona bene con jQuery e Ruby on Rails 3.1 (Pignoni)?
- 6. Non riesco a far funzionare UJS in Rails 3.1
- 7. rails 4 has_secure_password rendering password conferma opzionale
- 8. Ottenere ActiveModel :: Callbacks per funzionare con ActiveResource
- 9. Rails 5, Devise, Omniauth, Twitter
- 10. Password generata in modo casuale Rails 3.1
- 11. Ottenere offline_access per funzionare con Facebook
- 12. Come analizzare l'URL per ottenere l'URL di base? - Rails 3.1
- 13. Rails omniauth-facebook numero irrisolto
- 14. Uso RequireJS con Rails 3.1 app
- 15. Ottenere APC per giocare bene con spl_autoload_register
- 16. come ottenere jquery.couch.app.js per funzionare con IE8
- 17. Utilizzare Dir.glob per elencare le risorse in Rails 3.1?
- 18. Omniauth chiamata autorizzazione con l'Ajax
- 19. Rails 3.1 Percorsi API
- 20. Rails 3.1 nidificazione profonda con RABL
- 21. Rails 3.1 Assets in ActionMailer con image_tag
- 22. Rails 3.1 pipeline di asset con PDFKit
- 23. SSL-specifica in Heroku con Rails 3.1
- 24. Testing Rails 3.1 motore montabile con Rspec
- 25. Rails 3.1 Ransack HABTM
- 26. Rails 3.1 - Sviluppo con i modelli montabili
- 27. Utilizzo di Rails 3.1 con DataTables
- 28. Favicon con Rails 3.1 non viene visualizzato?
- 29. Come ottenere __debugInfo per funzionare con XDebug?
- 30. Ottenere log4j2 per funzionare con eclissi
Ho intenzione di provare il tuo metodo, fammi sapere se trovi un modo migliore. –
Questa sembra la soluzione più semplice. Ho appena impostato 'user.password_digest = SecureRandom.urlsafe_base64' nel mio metodo' from_omniauth'. (Anche se, dopo aver riletto la tua risposta, suppongo che non debba essere randomizzato perché non viene usato per l'autenticazione?). Dato questo è molto più veloce - mi chiedo quale sia la logica per optare per la risposta accettata? – umezo
Hai ragione. Sono andato avanti e ho cambiato la risposta. Anche se ho ancora scelto di usare BCrypt direttamente e scrivere i miei metodi di hashing della password. È troppo facile da fare e rende più chiare le tue intenzioni. –