2

我正在使用 casrack-the-authenticator gem 进行 CAS 身份验证。我的服务器在 Sinatra 之上运行 Thin。我已经让 CAS 身份验证位工作了,但我不确定如何告诉 Rack 拦截“/index.html”请求以确认 CAS 登录,如果不允许用户查看页面,则返回 HTTP 403 响应而不是提供实际页面。这个事情谁有经验?谢谢。

我的应用程序:

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

我的机架文件:

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
4

1 回答 1

2

Casrack-the-Authenticator 会将 CAS 信息放入 Rack 会话中。你可以在另一个 Rack 中间件或你的 Sinatra 应用程序中提取它。

以下是 Rails 应用程序,但概念与 Sinatra 或 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
于 2010-04-23T17:58:38.010 回答