2010-04-23 3 views
2

CAS 인증을 위해 casrack-the-authenticator gem을 사용하고 있습니다. 내 서버가 Sinatra 위에 얇게 실행됩니다. CAS 인증 비트가 작동하고 있지만 CAS 로그인을 확인하기 위해 "/index.html"요청을 가로 채기 위해 Rack에게 전달하는 방법을 모르며 사용자가 페이지를 볼 수 없으면 HTTP 403 응답을 제공합니다. 누구도이 경험이 있습니까? 감사.CAS 인증을위한 Thin, Sinatra 및 인터셉트 정적 파일 요청

내 애플 :

class Foo < Sinatra::Base 
    enable :sessions 
    set :public, "public" 
    use CasrackTheAuthenticator::Simple, :cas_server => "https://my.cas_server.com" 
    use CasrackTheAuthenticator::RequireCAS 

    get '/' do 
     puts "Hello World" 
    end 
end 

내 rackup 파일 :

require 'foo' 

use Rack::CommonLogger 
use Rack::Lint 

run Foo 
의 파일 서비스 (의견과 생각을 환영) 인증을 이해하는 랙을 받고에서

초기 시도 :

builder = Rack::Builder.new do 
    map '/foo/index.html' do 
     run Proc.new { |env| 
      user = Rack::Request.new(env).session[CasrackTheAuthenticator::USERNAME_PARAM] 
      [401, { "Content-Type" => "text/html" }, "CAS Authentication Required"] unless user 
      # Serve index.html because we detected user 
     } 
    end 

    map '/foo' do 
     run Foo 
    end 
end 

run builder 

답변

2

Casrack-the-Authenticator는 CAS 정보를 랙 세션에 넣습니다. Rack 미들웨어 또는 Sinatra 앱에서 다른 것을 꺼낼 수 있습니다. 다음

레일 응용 프로그램이지만, 개념은시나 또는 랙 미들웨어 비슷 다음 정보를

# in app/controllers/application_controller.rb: 
protected 

def require_sign_in! 
    render :nothing => true, :status => 403 unless signed_in? 
end 

def signed_in? 
    current_user.present? 
end 

def current_user 
    @current_user ||= Person.find_by_username(session[CasrackTheAuthenticator::USERNAME_PARAM]) 
end 
+0

감사합니다, 코드의 조각은 의미가 있습니다. 내가 잘 모르는 것은 Rack이 정적 컨텐츠 서버에 연결하는 것과 같습니다. 예를 들어 브라우저에서 내 JSON 요청이 올바르게 거부되지만 정적 파일 서비스가 Sinatra 애플리케이션을 우회하여 index.html을 제공하는 것으로 보입니다. –

+0

'Rack :: Static'을 사용하고 있습니까? 그렇다면 Casrack 미들웨어 뒤에 있습니까? 랙 파일을 보여 주면 도움이 될 것입니다. –

+0

이전에'Rack :: Static'을 사용하지 않았습니다. 사실 Sinatra :: Base를 확장 한 클래스에 casrack을 넣었습니다. 왜냐하면 어떤 이유에서든 제 랙크에 넣을 수 없었고'enable : sessions'을 사용할 수 없었기 때문입니다 (간단한 구문이나 구성 옵션을 놓친 것 같습니다.). 기본적으로 내 랙 및 Sinatra 앱의 모습을 게시했습니다. –