2013-04-04 2 views
1

Devizes를 사용하여 Rails 앱에서 인증을 처리하고 있으며 영구 삭제를 위해 permanent_records를 사용하고 있습니다. 내 사용자 모델의 기본 범위는 삭제되지 않은 사용자입니다. 사용자가 자신의 계정을 삭제 (비활성화)하면 페이스 북에서와 마찬가지로 로그인하여 계정을 다시 활성화 할 수 있기를 바랍니다. 문제는 Devise가 삭제 된 사용자를 찾지 못하기 때문에 계정이 발견되지 않는다는 것입니다. 내가 세션 번호를 무시할 생각은 방법을삭제 된 범위를 Devise 인증과 함께 사용

def create 
    self.resource = warden.authenticate!(auth_options) 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 

를 생성하지만이 소장에 의해 처리되기 때문에, 내가 운이있어 보인다. 나는 너무 깊게 파기 시작하면 일을 깨뜨리기 시작 할까 봐 걱정됩니다.

아이디어가 있으십니까?

감사합니다.

답변

4

당신이 필요합니다 : 사용자 모델에서

  1. 덮어 쓰기 find_for_authentication 방법은 https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L98

여기에 제거하기 위해 모델의 모든 사용자 https://github.com/plataformatec/devise/blob/master/lib/devise/models/authenticatable.rb#L229

  • 재정 after_database_authentication 방법에 대한 삭제 플래그를 발견 할 수 있도록

    그게 전부입니다, 나는 믿습니다. 컨트롤러 동작을 만질 필요가 없습니다.

  • +0

    신난다! find_for_authentication을 재정의하는 경우 기본 범위를 사용하지 않도록 지시하려면 어떻게해야합니까? 그들의 예는 find_first_by_auth_conditions (tainted_conditions, : active => true)입니다. 그러나 원하지 않습니다 : deleted => true, 삭제 된 레코드에 몇 가지 특별한 로직을 적용 할 수 있도록 삭제 된 레코드와 삭제되지 않은 레코드가 필요합니다. –

    +0

    특히 user = super ||와 같이 할 수 있다면 더 멋질 것입니다. find_first_by_auth_conditions (tainted_conditions, : deleted_at => "IS NOT NULL") 물론 "IS NOT NULL"은 해시에 전달할 수있는 것이 아닙니다. deleted_at가있는 레코드는 어떻게 찾을 수 있습니까? –

    +1

    자신의 파인더를 쓸 수 있습니다 (어댑터와 필드를 알고 있기 때문에). 'unscoped.where (tainted_conditions) .first' – MikDiet

    0

    이 편집증 보석으로 작동합니다

    class << self 
        def find_for_authentication(conditions) 
        User.unscoped do 
         user = super(conditions) 
         user.restore!(recursive: true) if user.deleted? 
         user 
        end 
        end 
    end