2013-08-01 4 views
0

비교를 위해 수동으로 암호를 암호화하려고합니다. 나는 this이 내가 전화 할 필요가있는 방법이라고 생각한다. 그러나 Sorcery::Model.encrypt('password')는 작동하지 않는다?마법의 수동 암호화 암호

나는

+0

: 그리고 조금 잡았다는 새로운 passwordpassword_confirmation 속성을 가진 모델을 초기화 할 때 유효성 검사가 같은 것을해야한다, 그래서 그것은 더러운 지나간 행보를 사용하는 before_validation 필터의 현재 crypted_passwordsalt 속성을 업데이트한다는 것입니다 귀하의 질문에 대답하지 않기 때문에 사과드립니다.하지만 인증 프레임 워크를 사용하는 경우 수동으로 암호를 암호화하려고하는 이유는 무엇입니까? 마법을 사용하여 암호 암호화를 전혀 관리하지 않아야합니다. –

+0

새 암호 외에 이전 암호 (예 : 원래 암호)를 입력해야하는 암호 기능을 업데이트하고 있으므로 "원래"암호를 해시하여 사용자의 현재 암호와 비교해야합니다 그것들이'User.load_from_reset_password_token (토큰)'대신에 암호가 – Lee

+0

으로 재설정되도록 허용하기 전에 일치하는지 확인 하시겠습니까? –

답변

2

NoMethodError: undefined method encrypt for Sorcery::Model:Module 나는 이것에 대한 해결책을 가지고 점점 계속.

가정 소서리는 기본 설정으로되어 있습니다. 뷰에서

: 당신이 필요로하는,

def update 
    @user = User.find(id) # find the user first. 
    # this is the magic, use the saved crypted_password and salt to authenticate user's password 
    authenticate = BCrypt::Password.new(@user.crypted_password) == params[:old_password] + @user.salt 
    if authenticate && @user.update_attributes(params[:user]) 
    ... # updated and redirect or whatever. 
    else 
    ... # fail 
    end 
end 

당신이 암호를하여 crypt 다른 방법을 사용하는 경우 :

= form_for @user do |f| 
    = f.label :old_password 
    = f.password_field :old_password 
    = label_tag :old_password 
    = password_field_tag :old_password 
    = f.label :password" 
    = f.password_field :password 
    = f.label :password_confirmation 
    = f.password_field :password_confirmation 
    = f.submit "Submit", class: "button" 

그런 다음 컨트롤러에, 당신이 할 수있는 (내가 템플릿 슬림 사용) 적절한 방법으로 마법 선을 바꾸십시오.

도움이 될 수 있습니다.

0

이전 질문에 모델에 검증을 이동하는 것이 더 좋습니다.

unless BCrypt::Password.new(self.crypted_password_was) == (old_password + self.salt_was) 
    errors.add(:old_password, 'is wrong') 
end