2012-09-21 4 views
4

두 개의 Devise 모델 User and Business가 있습니다. 두 가지 모두 단일 로그인 양식을 사용하여 로그인 할 수 있기를 바랍니다. 백본 js를 사용하고 있으며 사용자 지정보기를 사용하므로보기가 중요하지 않습니다. ajax 요청은 로그인에 사용되며 예상대로 작동하지만 사업용으로는 작동하지 않습니다.Devise - 여러 사용자를위한 단일 로그인 양식

Google을 검색하여이를 해결하기 위해 STI를 사용하는 몇 가지 해결책을 찾아 보았습니다.하지만 프로젝트가 많이 완료되었으므로 지금은 변경할 수 없습니다. Devise 세션 컨트롤러를 재정의하는 방법을 생각하고있었습니다.

  1. 주어진 이메일 주소가 사용자인지 확인하고 Warden을 사용하여 사용자를 인증합니다.
  2. 해당 이메일을 가진 사용자가 발견되지 않으면 관리자 (Warden)를 사용하여 비즈니스 모델로 인증하십시오.

위의 코드를 변경하는 방법을 알아낼 수 없으며, 소장님이 어떻게 작동하는지, 위의 내용을 달성하기 위해 어떤 매개 변수를 호출해야하는지, 어떤 함수를 호출해야 하는지를 알지 못합니다. 누구든지 올바른 방향으로 나를 가리키거나 앞으로 어떻게 나아가 야하는지에 대한 예를 제시 할 수 있습니까?

감사합니다.

답변

4

각 사용자 유형의 고유 한 요구 사항을 해결하기 위해 사용자 모델 만 사용하고 CanCanRolify을 사용하는 것을 고려하십시오. 몇 가지 코드로 시작하는 것을 의미 할 수도 있지만, 장기적으로 유지하는 것이 더 쉬울 수 있습니다.

그냥 내 말을 전하지 마십시오. Here's a related question with good responses.

+0

동의합니다. 너무 많은 시간이 지나기 전에 "역할"방식으로 이동하고 프로젝트는 세 번째 모델을 필요로합니다. – Zabba

6

걱정하지 않아도됩니다. 걱정하지 마세요.

당신의 최선의 방법은 Devise의 세션 컨트롤러를 오버라이드하고 세션을위한 '새로운'방법과 '만드는'방법을 바꾸는 것이라고 생각합니다.

class SessionsController < Devise::SessionsController 
    # GET /resource/sign_in 
    def new 
    resource = build_resource(nil, :unsafe => true) 
    clean_up_passwords(resource) 
    respond_with(resource, serialize_options(resource)) 
    end 

    # POST /resource/sign_in 
    def create 
    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 
end 

그리고 당신의 경로에

, 당신은 (당신이 사용자 모델 이름 내용에 따라) 같은 것을 사용하는 것이 :

그래서 자신의 "sessions_controller.rb", 당신은 이런 식으로 뭔가를해야합니다

devise_for :users, :controllers => { 
    :sessions => 'sessions' 
} 


devise_for :businesses, :controllers => { 
    :sessions => 'sessions' 
} 

위의 세션 컨트롤러는 전혀 사용자 지정되지 않았습니다. 나는 당신의 코드를 모른다. 그래서 나는 정말로 거기에서 도울 수 없다. 그러나 기본 단계는 다음과 같습니다.

  1. auth_optionsresource_name 변수가 데이터를 저장하는 방법을 이해하도록 검사하십시오.
  2. 사용자 테이블에 resource이 없으면 조건부 논리를 추가하여 변수를 변경하십시오.

Devise는 훌륭하지만 역할은 훌륭하지만 사용자 모델이 하나이거나 STI를 사용하는 경우에도 의미가 없습니다. 나는 최근 프로젝트에서이 문제를 다루었으므로 곧이 정확한 문제에 대해 더 긴 글을 쓰고있다.

+0

장치 작업은 [약간 변경되었습니다] (https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb). 사용중인 버전에서 작업을 복사 한 다음 'resource_name'을 로그인하려는 사용자 유형과 일치하도록 변경하십시오 (예 :': business'). –

+0

안녕하세요, 친구가 그 블로그 게시물을 한 적이 있습니까? – hamstar

+0

@hamstar - 아니,하지 않았다. 실제로 Devise에 더 많은 것을 얻었고 내 자신의 솔루션을 굴렸다. 현재 가지고있는 문제가 있습니까? 질문에 답할 수있어서 기쁩니다 (답변을 알고 있다고 가정). – Bryce

4

나는 최근이 작업을하기 위해이 총 해킹을 생각해 냈습니다. 내 충고는 하나의 역할을 가진 단일 사용자 모델을 강력하게 고려하는 것이지만, 적어도 현재의 Devise 버전에서는 작동합니다.당신이 monkeypatch하거나이 같은 기본 동작을 오버라이드 (override)하는 경우

https://gist.github.com/jeremyw/5319386

, 당신은 당신이 이제까지 고안를 업그레이드하려고 할 경우에 좋은 테스트 스위트를 가지고 있는지 확인하십시오.

+0

관련 소스 코드를 포함하고 추가 참조로만 링크를 제공하는 것이 더 좋을 것입니다. –

관련 문제