2013-04-07 3 views
2

레일즈 3.2 응용 프로그램에 대한 인증으로 Devise를 사용하고 있습니다. 내 사용자 모델을 User라고하며 소프트 삭제를 구현하려고했습니다. 내가 자동으로 당신을 위해 일하는 acts_as_paranoid를 사용하여 이것을하려고합니다. 내가 비활성화 된 사용자가 계속 로그인하여 "비활성화 된"화면을 볼 수 있도록하려는 경우를 제외하고 모든 것이 예상대로 작동합니다 (다른 사용자는 더 이상 "삭제 된"사용자를 볼 수 없습니다). 그리고 계정을 다시 활성화 할 수있는 기회를 제공하십시오.devise의 authenticate 및 current_user 메서드를 소프트 삭제로 작동하도록 사용자 정의/편집 적으로 작동

문제는 Devise (Warden?)가 더 이상 삭제 된 사용자를 찾을 수 없다는 것입니다. Acts_as_paranoid를 사용하면 "with_deleted"범위를 사용하면 소프트 삭제 된 레코드에 액세스 할 수 있습니다. 정보 로그가, 내가 성공적으로 가지고있는 플래시 메시지가 나타납니다 때 입력 그래서 지금

def self.find_first_by_auth_conditions(warden_conditions) 
    conditions = warden_conditions.dup 
    where(conditions).with_deleted.first 
end 

내가 내 사용자 모델에이를 넣어 : 그래서 거기 방법의 일부를 얻을 수 있어요 로그인하고 사용자 모델의 "updated_at"열을 만지고 sign_in_count 등을 증가시킵니다. 그러나 인증 된 메소드가 false를 리턴하고 current_user 도우미 메소드가 nil을 리턴한다는 의미에서 실제로는 인증하지 않습니다. 그렇다면 이러한 최선의 전략은 무엇입니까? current_user 메소드를 어떻게 든 재정의하여 with_deleted 범위로 User 모델을 쿼리 할 수 ​​있습니까? 나는 find_first_by_auth_conditions 메소드를 사용했을 때처럼 추가 된 조건과 같이 관리자에게 뭔가를해야합니까? 나는 이것을하는 방법을 이해할 수 없다. 어떤 도움을 주셔서 감사합니다!

또한 정상적으로 작동하면 모든 소프트 삭제 된 사용자를 영구적으로 삭제하거나 다시 활성화하는 유일한 "비활성화 된"페이지로 보내고 싶습니다. "authenticated : user do {} end"를 통해 라우팅을 수행하는 방법이 있습니까? 아니면 모든 요청에서 before_filter를 application_controller에두고 사용자를 확인해야합니까?

답변

0

감사합니다, 그것은 내가으로 인증 모듈과 외모 내부에있는 serialize_from_session 메소드를 오버라이드 (override) 할 필요 밝혀 이 같은 :

def serialize_from_session(key, salt) 
    record = to_adapter.get(key) 
    record if record && record.authenticatable_salt == salt 
end 

내가 이니셜 라이저를 사용하여 모듈 (I은 기존의 전략을 무시하려고했다, 또한 소장에 대한 새로운 하나를 작성하려고) 재정의 할 수없는 성공을 시도하고 있었다; 하지만 이상한 이름 오류가 계속 발생했습니다. 나는 아직도 그것을 알아 내지 못했다. 그러나 팁을 사용하여 필자는 User 모델 내에서이 메소드를 오버라이드했습니다. 다른 리소스를 사용할 것으로 예상하지 않기 때문에 이처럼 편집하지 않아도됩니다. 코드는 단지였다

def self.serialize_from_session(key, salt) 
    record = with_deleted.find(key).first 
    record if record && record.authenticatable_salt == salt 
end 

이것은 전부 to_adapter.get 방법을 건너 뛰고 (orm_adapter에, 어떤, 관심있는 사람들에게,하지 고안, 나는이 메소드를 오버라이드 (override) 할 필요 내가 생각으로이 찾을 잠시 나를 데려) . 이것은 아마도 이것을 수행하는 가장 깨끗한 방법은 아니지만 그것은 저에게 충분합니다. 그리고 다른 리소스를 가지고 있더라도 User 리소스를 덮어 씀으로써 모든 것이 잘 작동 할 것이라고 생각합니다.

문제가 발생하면 여기에 추가하겠습니다. 그렇지 않다면, 이것은 누군가를 어떤 식 으로든 도울 수 있기를 바랍니다. 물론 바닥까지 내려갈 정도로 오래 걸렸습니다!

0

"비활성화 된 페이지"로 라우팅하는 것과 관련하여 마지막 질문에 답변 해 드릴 수 있습니다. 당신은 다음과 같이 다양한 유형의 사용자를 분리하는 람다를 사용할 수 있습니다 유증 그룹에서 팁

authenticated :user, lambda {|u| u.deactivated? } do 
    root :to => 'application#deactivated' 
end 
authenticated :user, lambda {|u| u.active? } do 
    root :to => 'application#active' 
end 
+0

이 부분에 대한 응답 주셔서 감사합니다. 문제는 이것 (내가 아는 한 지금까지 "삭제 된"사용자와 함께 작동하도록 실제로 인증을 얻는 중임)이 루트 경로 만 'application # deactivated'또는 'application'으로 라우팅한다는 것입니다. #activate '.이렇게해도 경로에 상관없이 비활성화 된 사용자는이 동일한 페이지로 보내지지 않습니다. 즉, 비활성화 된 사용자가 root.com/any로 이동하면 여전히 비활성화 된 페이지를 보길 원하지만 이처럼 경로를 설정하면 그렇게 할 수 없습니다. 나는 여러 경로를 보호하려고하기 때문에 필터 전에는 아무런 방법이 없다고 생각합니다. – kindofgreat