2013-08-10 2 views
1

나는 Rails 4 앱을 인증 보석류 'clearance'와 함께 구축하고 있습니다. 나는 다음과 같은 문제에 봉착 해있다 :Rails 4 with Clearance 비밀번호 재설정 문제

사용자가 자신의 암호를 잊어 버렸고 새 암호를 설정하려고 할 때 사용자를 찾을 수 없다.

내가 문제라고 생각합니다 ..

Started PUT "/passwords/1?token=[FILTERED]" for 127.0.0.1 at 2013-08-10 21:00:58 +0200 
Processing by PasswordsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "password_reset"=>"[FILTERED]", "token"=>"[FILTERED]", "id"=>"1"} 
    User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL AND "users"."confirmation_token" = 'bcc6a5b49bc64628eff15bf92761fe1775ef252c' LIMIT 1 
    Rendered passwords/new.html.slim within layouts/application (0.9ms) 
    Rendered partials/_favicon_styles.html.slim (0.4ms) 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_navigation.html.slim (11.2ms) 
    Rendered partials/_notification.html.slim (0.1ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_footer.html.slim (1.0ms) 
Filter chain halted as :forbid_non_existent_user rendered or redirected 
Completed 200 OK in 38ms (Views: 33.0ms | ActiveRecord: 2.3ms) 

그러나 사용자가 로그인 할 때, 그 또는 그녀는 암호를 변경할 수 있으며, 일반적으로 작품 로그인 :이 서버 로그입니다 (하지만 DB에 존재) 쿼리에서 ID를 폼과 함께 보내지 만 ID가 쿼리에 도달하면 IS NULL이 표시됩니다. 하지만 몇 시간 동안 고생했지만 해결할 수 없습니다.

또한 캐시 문제에 대한 7 회 요청이 있습니까?

미리 감사드립니다.

업데이트

강한 매개 변수와 다음으로 'find_user_by_id_and_confimatrion_token'방법 변경 :

def find_user_by_id_and_confirmation_token 
    Clearance.configuration.user_model. 
    find_by_id_and_confirmation_token params[:**id**], params[:token].to_s 
    end 

This was :user_id, this is not the name of the params.

def password_reset_params 
    # if params.has_key? :user 
    # ActiveSupport::Deprecation.warn %{Since locales functionality was added, accessing params[:user] is no longer supported.} 
    # params[:user][:password] 
    # else 
    # params[:password_reset][:password] 
    # end 

    params.require(:password_reset).permit(:password_reset, :password, :token, :id) 
    end 

을하지만 이것은 또 다른 오류가 발생합니다 :

Started PUT "/passwords/1?token=[FILTERED]" for 127.0.0.1 at 2013-08-11 16:31:20 +0200 
    Processing by PasswordsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "password_reset"=>"  [FILTERED]", "token"=>"[FILTERED]", "id"=>"1"} 
    User Load (1.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."confirmation_token" = 'd892a4698f5eff29e34378716ebd46414ad6e8cf' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."confirmation_token" = 'd892a4698f5eff29e34378716ebd46414ad6e8cf' LIMIT 1 
    (0.4ms) BEGIN 
    User Exists (1.0ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 1) LIMIT 1 
    (0.4ms) ROLLBACK 
    Rendered passwords/edit.html.slim within layouts/application (1.2ms) 
    Rendered partials/_favicon_styles.html.slim (0.3ms) 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_navigation.html.slim (4.7ms) 
    Rendered partials/_notification.html.slim (0.1ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_footer.html.slim (0.4ms) 
Completed 200 OK in 112ms (Views: 12.5ms | ActiveRecord: 4.1ms) 

사용자가 이미 존재 함을 나타내며 변경 사항을 롤백합니다. 이 업데이트이므로 사용자가 있어야합니다.

업데이트 난 아직도이 문제 방법을 잊어 버린 암호를 편집 및 암호를 통해 누가 로그인 한 사용자 A (로그인하지) 사이 여기의 차이

를 해결하기 위해 노력하고있어 2

암호를 잊어 새로운 passw을 입력

Started PATCH "/admin/users/1" for 127.0.0.1 at 2013-08-13 16:12:07 +0200 
    Processing by Admin::UsersController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "user"=>{"password"=>"  [FILTERED]", "password_confirmation"=>"[FILTERED]"}, "id"=>"1"} 
    User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'f1078c2b74f6b3b3c9950b87a5b927db3f2bffcd' LIMIT 1 
    User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1(0.4ms)  
    BEGIN 
    User Exists (1.0ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 1) LIMIT 1 
    SQL (1.6ms) UPDATE "users" SET "encrypted_password" = $1, "updated_at" = $2 WHERE "users"."id" = 1 [["encrypted_password", "$2a$10$F4p6N0va/TY2nKOiXOSQ7e23NnHPyDytQZ6EvhtGd7FJ2oTMVFbSS"], ["updated_at", Tue, 13 Aug 2013 16:12:07 CEST +02:00]](12.6ms) 
    COMMIT 
    Rendered admin/users/edit.html.slim within layouts/application (8.7ms) 
    Rendered partials/_favicon_styles.html.slim (0.3ms) 
    Rendered partials/_olderbrowser.html (0.0ms) 
    Rendered partials/_navigation.html.slim (2.6ms) 
    Rendered partials/_notification.html.slim (0.1ms) 
    Rendered partials/_footer.html.slim (0.1ms) 
Completed 200 OK in 167ms (Views: 23.0ms | ActiveRecord: 17.3ms) 

사용자의 사용자 암호 변경과 로그인

Started PUT "/passwords/1?token=[FILTERED]" for 127.0.0.1 at 2013-08-13 16:58:45 +0200 
    Processing by PasswordsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "user"=>{"password"=>"[FILTERED]"}, "token"=>"[FILTERED]", "id"=>"1"} 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."confirmation_token" = 'b198361b098c1bf110a2171dd7f00258d9ca9240' LIMIT 1 
    CACHE 
    (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."confirmation_token" = 'b198361b098c1bf110a2171dd7f00258d9ca9240' LIMIT 1 
    (0.3ms)BEGIN 
    User Exists (0.5ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 1) LIMIT 1 
    (0.2ms) ROLLBACK 
    Rendered passwords/edit.html.slim within layouts/application (1.4ms) 
    Rendered partials/_favicon_styles.html.slim (0.3ms) 
    Rendered partials/_olderbrowser.html (0.0ms) 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_navigation.html.slim (5.0ms) 
    Rendered partials/_notification.html.slim (0.1ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_footer.html.slim (0.5ms) 
Completed 200 OK in 102ms (Views: 14.7ms | ActiveRecord: 2.0ms) 

ORD는 아직도 풋/패치 방법 및 모든 캐시 경고를 기대합니다. 이것은 나에게 꽤 똑같은 것처럼 보입니다 ... 나는 패치 http 메서드를 사용하려고 시도했지만 도움이되지 않았습니다.

업데이트 3

또한 내 컨트롤러 코드는 거의 같은 정리로 :: PasswordsController. 내 문제로 불리지 않는 메소드를 삭제했습니다.다음 SQL 쿼리에서 트리거되는 위치

require 'active_support/deprecation' 

class PasswordsController < ApplicationController 

skip_before_filter :authorize, :only => [:create, :edit, :new, :update] 
before_filter :forbid_missing_token, :only => [:edit, :update] 
before_filter :forbid_non_existent_user, :only => [:edit, :update] 

def edit 
    @user = find_user_for_edit 
    render :template => 'passwords/edit' 
end 

def update 
    @user = find_user_for_update 

    if @user.update_attributes(password: password_reset_params) 
    sign_in @user 
    redirect_to url_after_update 
    else 
    flash_failure_after_update 
    render :template => 'passwords/edit' 
    end 
end 

private 

def password_reset_params 
    if params.has_key? :user 
    ActiveSupport::Deprecation.warn %{Since locales functionality was added, accessing params[:user] is no longer supported.} 
    params[:user][:password] 
    else 
    params[:password_reset][:password] 
    end 
end 

def find_user_by_id_and_confirmation_token 
    Clearance.configuration.user_model. 
    find_by_id_and_confirmation_token params[:id], params[:token].to_s 
end 

def find_user_for_edit 
    find_user_by_id_and_confirmation_token 
end 

def find_user_for_update 
    find_user_by_id_and_confirmation_token 
end 

def forbid_missing_token 
    if params[:token].to_s.blank? 
    flash_failure_when_forbidden 
    render :template => 'passwords/new' 
    end 
end 

def forbid_non_existent_user 
    unless find_user_by_id_and_confirmation_token 
    flash_failure_when_forbidden 
    render :template => 'passwords/new' 
    end 
end 
end 
+1

동일한 이메일 주소로 데이터베이스에 두 명의 사용자를 얻었습니까? 업데이트 작업이 전자 메일의 고유성을 검사하고 실패한 것 같습니다 (두 번째 사용자 '[email protected]'을 찾아서 실패합니다.) – bgates

+0

DB에 다른 메일 주소가있는 테스트 계정이 두 개 밖에 없지만, 전에 로그인 한 사용자의 경우이 문제가 있었지만 사용자 테이블의 전자 메일 색인을 비활성화하면 다시 액세스 할 수있었습니다. 관련이 있다면 확실하지만 확실한 것 같아요. – Loed

+0

'PasswordController # update'는 어떻게 생깁니 까? – bgates

답변

0

당신은 추적해야합니다

User Exists (0.5ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 1) LIMIT 1 

이것은 당신이 실패 저장의 원인이되는 라인입니다. 내 생각 엔 @user.update_attributes을 호출 할 때 발동하는 사용자 모델에 대한 유효성 검사 또는 다른 콜백이 있다는 것입니다. 확인/콜백이 실패하여 저장이 실패합니다.

+0

감사합니다! 그랬더니 'password_confirmation'이라는 존재를 입증하지 못했습니다. 분명히 앱의이 부분을 제시하지 못했습니다. 내가 그것을 추가했을 때, 모든 것이 잘 작동한다! 다시 한 번 감사드립니다! – Loed

0

저장을 실패하게하는 행입니다. 내 생각 엔 @ user.update_attributes를 호출 할 때 발동하는 사용자 모델에 유효성 검사 또는 다른 콜백이 있다는 것입니다. 확인/콜백이 실패하여 저장이 실패합니다.

+3

다음 행은 무엇입니까? 당신은 실제로 하나도 보여주지 않았습니다 ... – anaximander