2010-04-23 23 views
2

J'utilise la gemme casrack-the-authenticator pour l'authentification CAS. Mon serveur fonctionne sur Thina au dessus de Sinatra. J'ai réussi à faire fonctionner le bit d'authentification CAS, mais je ne suis pas sûr de savoir comment dire à Rack d'intercepter les requêtes "/index.html" pour confirmer la connexion CAS, et si l'utilisateur n'est pas autorisé à voir la page, retourner un HTTP 403 au lieu de servir la page réelle. Est-ce que quelqu'un a de l'expérience avec ça? Merci.Thin, Sinatra, et interception de la requête de fichier statique pour l'authentification CAS

Mon application:

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 

Mon fichier rackup:

require 'foo' 

use Rack::CommonLogger 
use Rack::Lint 

run Foo 

Première tentative à obtenir rack de comprendre l'authentification dans son service de fichiers (commentaires et réflexions de bienvenue):

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 

Répondre

2

Casrack-the-Authenticator placera les informations CAS dans la session Rack. Vous pouvez le retirer dans un autre morceau de middleware Rack ou dans votre application Sinatra.

Ce qui suit est pour une application Rails, mais le concept est similaire pour Sinatra ou un middleware 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

Merci pour l'info, ce morceau de code est logique. Ce dont je ne suis pas sûr, c'est l'équivalent Rack de l'accrochage dans le serveur de contenu statique. Mes demandes JSON du navigateur sont rejetées correctement, par exemple, mais le service de fichiers statiques semble contourner mon application Sinatra et fournir index.html de toute façon. –

+0

Utilisez-vous 'Rack :: Static'? Si oui, est-ce derrière le middleware Casrack? Peut-être que montrer votre fichier rackup aiderait. –

+0

Je n'utilisais pas 'Rack :: Static' avant. En fait, j'ai mis casrack dans ma classe qui étend Sinatra :: Base, parce que pour une raison quelconque, je ne pouvais pas l'avoir dans mon rack et le faire fonctionner avec 'enable: sessions' (j'ai probablement manqué une simple syntaxe ou option de configuration,). J'ai posté essentiellement ce que mon application rackup et Sinatra ressemble actuellement. –