2011-01-11 2 views
2

남자. authlogic 로그인 검증을 수행 할 때 문제점이 있습니다. 나는 사용자 모델에 마법의 "활성"필드를 가지고 있는데, 예를 들어 액티브가 틀리면 올바른 비밀번호로 로그인 할 때 "일시 중지되었습니다. 관리자에게 문의하십시오."와 같은 메시지가 나타날 것입니다 (I18n 파일에서이 메시지를 정의했습니다.); 잘못된 비밀번호로 로그인하면 not_active 메시지와 함께 "password invalid"와 같은 password_invalid 메시지가 나타납니다. authlogic이 "활성"필드와 암호 모두에 대한 유효성 검사를 수행 했으므로 암호 유효성 검사가 먼저 이루어 졌다고 생각합니다.Authlogic 인증 주문

제 질문은 '활성'이 거짓 인 경우 암호 유효성 검사를 무시할 수있는 방법입니다. 또는 not_active 메시지 만 표시 할 수 있습니까? 내 코드는 같은 :

if @user_session.save 
    redirect_to home_path 
else 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
end 
+0

먼저 암호를 확인한 다음 활성 상태인지 확인해야한다고 생각합니다. –

+0

@ Joy :하지만 액티브가 틀린 경우 암호 유효성 검사를 무시하고 싶습니다. 사용자가 입력 한 right_password 또는 password_invalid와 상관없이 password_invalid 메시지없이 비활성 상태 인 경우에만 not_active 메시지를 표시하려고합니다. –

답변

1

OK, 그래서 사용자 경험으로이 마음에 들지 않지만, 당신이 정말로, 같은 것을 수행하려는 경우 :

before_filter :restrict_inactive_users, :on=>:create 

def restrict_inactive_users 
    @user = User.find_by_login(params[:user_session][:login]) rescue nil 
    return unless @user 
    unless @user.active? 
    flash[:error] = "You are suspended, please contact your administration" 
    render :action=>:new 
    return false 
    end 
end 

def create 
    @user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
    redirect_to home_path 
    else 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
    end 
end 
+0

Jesse에게 감사드립니다.이 솔루션은 이해하기 쉽습니다. :) –

0

오늘 나는 해결책을 생각 이는 암호 유효성 검사를 무시하지 않고 user_session에서 암호 오류 메시지 만 삭제합니다. 같은 코드 :

if @user_session.save 
    redirect_to home_path 
else 
    @user_session.errors.delete(:password) unless @user_session.attempted_record.active 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
end 
0

전자 메일 또는 사용자 이름과 같이 원하는 식별자로 사용자를 가져 오는 것으로 시작하십시오. 사용자가 활성화되어 있지 않으면 로그인 페이지로 다시 돌아 가기 전에 다른 오류를 제거 할 수 있습니다.

 @user_session.errors.clear 

그러면 페이지가 다시 렌더링 될 때 오류가 표시되지 않습니다. 하지만 사용자 정의 오류 메시지 (예 : flash.now[:error] 또는 json 응답)를 제공해야합니다.