Elaborar redefinição de senha do console Rails

92

Ao executar um aplicativo, como você seleciona um usuário por endereço de e-mail e, em seguida, define a senha manualmente rails consolepara o Devise?

Além disso, onde eu iria revisar a documentação para cobrir mais detalhes a respeito da manipulação de contas durante o uso do Devise?

iluminar
fonte
Valk: where () não está disponível até o rails 3. Mas, a maneira como você fez está bem também.
Hellion

Respostas:

138

É mais ou menos como você descreveu :-)

# use mongoid
class User
  include Mongoid::Document
end


# then
user = User.where(email: '[email protected]').first

if user
  user.password = new_password
  user.password_confirmation = new_password
  user.save
end

Atualização de 6 anos depois :)

O projeto moderno permite uma sintaxe mais simples, sem necessidade de definir o campo de confirmação

user.password = new_password; user.save
# or
user.update_attributes(password: new_password)
Sergio Tulentsev
fonte
Ah, hmm. Isso funcionaria para um usuário padrão, mas neste caso é da tabela admin_users. Qual é o ajuste apropriado para extrair dessa tabela em relação aos usuários? Simplesmente defini-lo como user = AdminUser ... não funcionou.
iluminar
Umm, eu não sei, modelo de consulta AdminUser? Quanto a mim, sempre armazenei todos os usuários nas mesmas tabelas, com o atributo 'roles' atribuído.
Sergio Tulentsev
Você pode alterar o nome da coleção a que o modelo se refere com o método store_in. Então, para olhar na tabela admin_users, você teria que adicionar User.store_in 'admin_users' antes desse código. (esta resposta implica o uso de Mongoid)
Sergio Tulentsev
Tentativa User.store_in 'admin_users'porém recebida undefined method. Aparentemente, não consigo acessar a tabela, pois só recebo um zero de volta a cada vez. Que tal consultar a tabela inteira e apenas obter todas as entradas nela inicialmente para testar se estou entrando naquela tabela inicialmente? (Trabalhando em MySQL aqui, no entanto, isso não deve importar com ActiveRecord.)
iluminate
: store_in é uma parte do Mongoid gem. Você pode obter acesso ao driver ruby ​​de baixo (er) nível chamando User.db
Sergio Tulentsev
55
# $ rails console production
u=User.where(:email => '[email protected]').first
u.password='userpassword'
u.password_confirmation='userpassword'
u.save!
Eric Guo
fonte
1
devise é cozido em trilhos, então o uso da confirmação pw é redundante. User.find_by_email('[email protected]').update_attributes(:password => 'password')
copremese de
26

Se você executar o seguinte no console de trilhos, isso deve funcionar:

User.find_by(email: 'user_email_address').reset_password!('new_password','new_password')

http://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Recoverable

gstraehle
fonte
6
Observe que o ponto de exclamação está obsoleto, é apenas:User.find_by(email: 'user_email_address').reset_password('new_password','new_password')
IrishDubGuy
1
Observe também que você deve inserir uma senha válida que confirme os requisitos de senha em sua configuração de dispositivo.
zwippie
5

Você pode simplesmente atualizar o campo de senha, sem necessidade de senha de confirmação, o devise irá salvá-lo de forma criptografada

u = User.find_by_email('[email protected]')
u.update_attribute(:password, '123123')
Kshitij
fonte
3

Por algum motivo, (Rails 2.3 ??)

user = User.where(:email => email).first

não funcionou para mim, mas

user = User.find_by_email('[email protected]')

fez isso.

valk
fonte
A razão para isso é que o where (); método ainda não estava no rails 2.3, costumávamos usar o find (: all,: conditions => conditions) antigamente.
dennis
3

1. Faça login no console ralis

$ sudo bundle exec rails console production

2. Em seguida, atualize a senha do administrador

irb(main):001:0> user = User.where("username = 'root'")
irb(main):002:0> u = user.first
irb(main):003:0> u.password="root2014@Robin"
=> "root2014@Robin"
irb(main):004:0> u.password_confirmation="root2014@Robin"
=> "root2014@Robin"
irb(main):005:0> u.save
=> true
irb(main):006:0> exit

3. Atualize a página de login, use a nova senha para fazer o login, divirta-se!

Boa sorte!

Robinwen
fonte
devise é integrado, portanto, o uso da confirmação pw é redundante. User.find_by_email('[email protected]').update_attributes(:password => 'password')
copremese de
0

Se sua conta for bloqueada devido a muitas tentativas de login, você também pode precisar fazer:

user.locked_at = ''
user.failed_attempts = '0'
user.save!
Enzio
fonte