2010-04-23 5 views
2

Я использую драгоценный камень casrack-the-authenticator для аутентификации CAS. Мой сервер работает на Thin поверх Sinatra. Я получил бит проверки подлинности CAS, но я не уверен, как сообщить Rack перехватить запросы «/index.html» для подтверждения входа в CAS, и если пользователю не разрешено просматривать страницу, верните HTTP 403 вместо того, чтобы обслуживать фактическую страницу. У кого-нибудь есть опыт? Благодарю.Thin, Sinatra, и перехват статического запроса файла для проверки подлинности CAS

Мое приложение:

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 

Первоначальная попытка получения Rack понять аутентификации в файловой службе (комментарии и мысли приветствуются):

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.

Ниже для приложения Rails, но концепция похожа на Синатры или Rack промежуточного:

# 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'. Я действительно ставил casrack в свой класс, который расширяет Sinatra :: Base, потому что по какой-то причине я не мог иметь его в своем rawn и работать с 'enable: sessions' (я, вероятно, пропустил простой синтаксис или конфигурацию, хотя). Я опубликовал в основном то, что на самом деле выглядит моим приложением для Android и Sinatra. –

 Смежные вопросы

  • Нет связанных вопросов^_^