2014-12-15 3 views
0

전자 메일 주소와 선택적 암호 및 이름을 제공하는 경량급 사용자를 제공하는 두 가지 사용자 클래스가 있습니다. 경량의 사용자가 브라우저를 닫은 후에도 내 사이트로 돌아 가면 이름이 자동으로 기억되어 경량 권한으로 자동 로그인해야합니다. 해당 이름이 고유하지 않을 수 있으므로 사용자 ID를 기반으로 간단한 사용자에게 서명하고 싶습니다. 의 devise.rb 이니셜 라이저에서레일 4 : devise를 사용하여 user_id를 기반으로 사용자를 인증하는 방법

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    def password_required? 
    false 
    end 

    def email_required? 
    false 
    end 

    def remember_me 
    true 
    end 

:

내가 고안를 사용하고 있습니다. (경량 사용자는 나중에 자신의 이메일 주소를 추가하여 전체 사용자가 될 수 있습니다), 그리고 내 user.rb 파일 포함 나는

config.authentication_keys = [ :user_id ] 

설정을 시도했지만 그것은 이메일 주소가있는 사용자에 대한 인증을 위반 이외의 다른 영향을주지 않았다.

config.authentication_keys = [: email]를 사용하면 브라우저를 다시 시작하거나 세션 쿠키가 삭제 되더라도 이메일 주소를 제공 한 사용자는 사이트에 성공적으로 로그인됩니다. 그러나 브라우저를 다시 시작하면 이름이있는 사용자를 돌려 보내는 것을 잊어 버릴 수 있습니다. 두 경우 모두 remember_user_token 쿠키가 있습니다.

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address을 보면, Devise의 find_for_database_authentication 메소드를 덮어 써야 할 수도 있습니다.하지만 그걸 넣어야할지, 아니면 충분할 지 모르겠습니다. 나는 성공하지 않고 그 변화를 시도했다.

+0

전자 메일 인증을 원하지 않는다면 괜찮을 것입니다. 그러나 약간 변경되면서'user_id', 사용자'id' 대신 위키의 기사를 보시면 도움이 될 것입니다. https : //github.com/plataformatec/devise/wiki/How-To : -Allow-users-to-sign-in-their-username-or-email-address- – kurenn

+0

감사합니다. Kurenn. user [space] id에 대해 정확히 무엇을 의미하는지 확신 할 수 없습니까? 나는 첨부 된 것을 보았습니다, 그것은 제가 다른 연구에 관해 언급하고있는 것이 었습니다. 그리고 그것은 도움이되지만 그것은 저를 저쪽으로 끌어 들이지 못했습니다. – Will

답변

0

마지막으로 알아 냈습니다. 다른 사람들이 같은 문제가있는 경우를 대비해 여기에 답이 있습니다.

관련 로그인 프로세스는 Devise의 기억 가능 모듈에서 발생합니다.

Devise는 세션간에 저장된 사용자 정보를 remember_user_token 쿠키에 저장합니다. 쿠키는 사용자 ID와 기억 토큰을 모두 포함합니다.

이메일과 비밀번호가 모두 비어 있으면 기억 토큰도 비어있어 내부 개발자 비교 (secure_compare)가 실패합니다. 이로 인해 세션이 손실되고 remember_user_token 쿠키가 삭제됩니다.

이 문제를 해결하려면 암호가없는 사용자의 임시 암호를 설정할 수 있습니다. 하나의 접근법은 다음과 같습니다.

class RegistrationsController < Devise::RegistrationsController 

    def sign_up_params 
    new_params = devise_parameter_sanitizer.sanitize(:sign_up) 

    # If no password is supplied for new user, create one 
    # This is needed because Devise requires a password for Rememberable to work, 
    # even if password_required? is set to false in the User model. 
    if (new_params[:password] == nil) 
     new_params[:password] = Devise.friendly_token 
    end 

    # return the modified (and further sanitized) params list 
    new_params 
    end 
end 

사용자가 수행하려는 작업에 따라 사용자가 가지고있는 임시 비밀번호를 알리는 것은 사용자에게 달려 있습니다. 또는 나중에 이메일 주소를 추가하면 이메일 주소를 확인하게 할 수도 있습니다.

관련 문제