2016-07-01 3 views
2

설정/application.rb레일 미들웨어에서 devise를 사용하여 사용자를 인증하는 방법은 무엇입니까?

내가 사용
config.middleware.insert_before(Rack::Runtime, Rack::ReverseProxy) do 
    reverse_proxy_options preserve_host: false 
    reverse_proxy '/external/app', 'https://runalong.com:64167/app' 
end 

랙 리버스 프록시 (서버를 레일하지 않음) 특정 URL이 요청 될 때 다른 호스트에서 실행되고있는 다른 서버로 요청을 전달. 이제 사용자가 devise를 사용하여 signed_in인지 확인한 다음 프록시 서버로 요청을 전달하고 그렇지 않으면 사용자를 로그인 페이지로 다시 보냅니다.

+0

Pls는 앱에 대해 Devise (및 기본 워든)를 구성하는 방법에 대한 세부 정보를 추가합니다. 기본적으로 Warden :: Manager 미들웨어는 middlewares 스택의 [end] (https://github.com/plataformatec/devise/blob/e01fdba557f0da3c9a528011edee5b4e0989722d/lib/devise/rails.rb#L8)에 추가됩니다. 랙 : :실행 시간. 따라서 아직 코드에서 사용할 수 없습니다. –

답변

2

업데이트. 일반적으로 대상 서버를 공개적으로 사용할 수 있다고 가정 할 때 임시 서버가 안전하지 않은 경우에만 확인하므로 인증 전략을 고려해야합니다.

기본적으로 귀하의 질문에 대한 대답은 - Devise는 Rails 애플리케이션에 자체 미들웨어를 추가하지 않으므로 Devise를 미들웨어로 사용할 수 없습니다. 잠재적으로 Warden 미들웨어를 사용할 수 있습니다.

Devise는 워든 (Warden) 위에 있습니다. 미들웨어 스택의 단부에 injectsWarden::Manager 미들웨어 궁리 (또한 omniauth 미들웨어 주입 수) : 다른

# Initialize Warden and copy its configurations. 
config.app_middleware.use Warden::Manager do |config| 
    Devise.warden_config = config 
end 

을 그 고안 즉 이러한 sign_in 같은 헬퍼 추가 제어기와 마찬가지로, 레일 애플리케이션 레벨에서 작동한다. 그러나 미들웨어 수준 자체에서는 작동하지 않습니다. 자체

감시자는 감시자가 지연되도록 설계 here

설명되는 "지연"이다. 즉, 사용하지 않으면 은 아무 것도하지 않지만 사용하면 동작으로 바뀌고 랙 기반 응용 프로그램의 인증을 허용하는 기본 메커니즘을 제공합니다.

Devise가 어떻게 든 소장 님과 조종하지 않으면, 소장 님은별로 도움이되지 않습니다. Warden이하는 일은 embedding 그 자체로서 다른 미들웨어 (및 Rails 응용 프로그램)에서도 env 변수에 액세스 할 수 있습니다. 이 인스턴스를 사용하십시오.

미들웨어에 소장을 사용하려면
result = catch(:warden) do 
    @app.call(env) 
end 

, 당신은 미들웨어에 포함해야합니다 :

env['warden'] = Proxy.new(env, self) 

소장은 또한 다른 미들웨어가 (또는 최종 레일 응용 프로그램에서) 던질 수있는 특별한 소장 예외 수신 이전 (대상 미들웨어보다 먼저). 그러면 교도관을 사용할 수있게 될 것입니다.

교도소 source의 의견에 따르면, 세션 생성 미들웨어 (예 : 이전) 이후에 포함되어야합니다.ActionDispatch::Session::CookieStore :

미들웨어 미들웨어 랙 환경 해시 세션

감시자 accessor 내로 인증 대상을 주입 상류 세션이 있다는 필요 랙 인증을위한 미들웨어 :

def session 
    env["rack.session"] || {} 
end 
관련 문제