2010-11-24 1 views
69

Dev 's에서 사용자의 암호를 변경하고 db에서 업데이트 된 후 즉시 사이트가 로그 아웃됩니다. 나는이 행동을 원하지 않습니다. 어떻게해야합니까? 도와주세요.암호 변경 후 자동으로 로그 아웃하는 장치

+3

"이 기능 e가 이러한 시나리오에 정확하게 추가 된 경우 관리자는 누군가 암호를 편집 할 때 해당 사용자가 로그 아웃 될 것임을 확신 할 수 있습니다.일부 장치를 도난당한 상황에서 매우 유용하며 웹 사이트에서 암호를 변경하면 장치를 훔쳐간 사람이 해당 웹 사이트에 액세스 할 수 없게됩니다. "bit.ly/1qkO7jx – Zajo

답변

122

나는 동일한 문제가 있었고 다음 코드는 저에게 효과적입니다.

암호 컨트롤러가 단일 경로에 대해 설정되었다고 가정하십시오. 또한 인증 된 모델이 계정이라고 가정합니다.

def update 
    if current_account.update_with_password(params[:account]) 
    sign_in(current_account, :bypass => true) 
    flash[:notice] = 'Password updated.' 
    redirect_to account_path 
    else 
    render :action => :show 
    end 
end 

주요 성분은 세션에 계정을 다시 로그인에하는 계정 추구하지만, 소장 콜백을 무시하고 저장하는 sign_in 메서드 호출입니다 : 그, 당신은 다음과 같은 있습니다.

+0

확인해 주셔서 감사합니다. 추측은 저자가 지금까지 다른 문제로 옮겨 갔다고 생각합니다. 당신의 위키가 다른 사람들을 돕기 위해 여전히 페이지에 빚졌습니다. –

+1

Devise가 왜 서명 할 지 확신하지는 않지만 고마워요. 먼저 모든 사용자를위한 노트 –

+6

앞으로의 모든 독자를위한 노트, 이것이 작동하지 않고'sign_in' 위에'sign_out'을 먼저 추가해야한다면, 인스턴스 변수에 모델을 포착 할 수 있도록 전달하십시오 'sign_in' 메쏘드를 통해 그렇지 않으면'nil'을 넘겨 줄 것입니다. – Simpleton

10

위의 예제는 내가 고안에서 여러 범위를 사용하여 작동하지 않았다 제공됩니다 등록 가능한 모듈을 사용합니다.

sign_in 경로에 범위/리소스 이름을 추가해야 혼란을 막을 수 있었고 이전 사용자를 로그 아웃해야했습니다. 그렇지 않으면 모든 종류의 혼동이 생길 것입니다.

변경 사항은 위의 예제를 사용하여 이와 유사합니다.

def update 
    if current_account.update_with_password(params[:account]) 
    sign_out(current_account) 
    sign_in(:account, current_account, :bypass => true) 
    flash[:notice] = 'Password updated.' 
    redirect_to account_path 
    else 
    render :action => :show 
    end 
end 

편집 추가 : 나는 어딘가에 사용자가 특정 작업 중에 로그 아웃이되지 위해 고안의 코드를 오버라이드 때문에 강제로 사용자를 로그 아웃했다 생각합니다. 뒤늦은 지혜; 좋은 생각이 아니야! 이 방법은 훨씬 더 좋습니다! 자신의 컨트롤러를 만드는 것이 절대적으로 불가피하지 않는 한 Devise의 코드를 무시하는 것보다 안전하다는 것을 의미합니다.

+0

마침내! 그것을 발견! 이것은 효과가있다! 내가'sign_out current_user'를 필요로하지 않았지만'sign_in : user, @user, bypass : true'가 필요하다는 것을 알게되었습니다. – Chloe

3

바로 데이터베이스에서 사용자의 암호를 업데이트 한 후, 당신의 방법에있는 당신이 사용자의 암호를 업데이트하는 다음 코드 조각을 추가

def update 
. . . . .<your code> 
. . . . .<your code> 

sign_in(@user, :bypass => true) 

. . . . .<your code> 
. . . . .<your code> 
end 
10

사용이 코드를 로그 아웃하지 않도록. 몇 가지 이유를 들어

sign_in(current_user, :bypass => true) 
2

current_user@user.id 같다 @usercurrent_user.id하지만 동일하지 않습니다. 그래서 sign_in(@user, :bypass => true)을 사용해야합니다.

2

당신은 단순히

sign_in(current_account, :bypass => true) 전술 빌 Eisenhauer 대답로 devise.rb

config.sign_in_after_reset_password = true 
관련 문제