hassox (owner)

Revisions

gist: 217383 Download_button fork
public
Public Clone URL: git://gist.github.com/217383.git
Embed All Files: show embed
Ruby #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
require 'rubygems'
require 'sinatra'
require 'warden'
 
Warden::Strategies.add(:password) do
  def authenticate!
    if params["login"] == "name"
      success!("the user")
    else
      fail!("Can't log you in")
    end
  end
end
 
Warden::Strategies.add(:nigel) do
  def authenticate!
    if params["login"] == "nigel"
      success!("the user")
    else
      fail!("You're not nigel")
    end
  end
end
 
Warden::Manager.before_failure do |env, opts|
  env['REQUEST_METHOD'] = "POST"
end
 
class ::MyMiddleware
 
  def initialize(app)
    @app = app
  end
 
  def call(env)
    request = Rack::Request.new(env)
    if request.path == "/custom"
      request.env["warden"].authenticate!
      Rack::Response.new("You're OK!").finish
    else
      @app.call(env)
    end
  end
end
 
 
class MyApp < Sinatra::Application
  use Rack::Session::Cookie
 
  use Warden::Manager do |manager|
    manager.default_strategies :password
    manager.failure_app = self
  end
 
  use MyMiddleware
 
  helpers do
    def warden
      request.env['warden']
    end
 
    def require_login(*args)
      warden.authenticate!(*args)
    end
  end
 
  get "/authd" do
    require_login
    "Session: #{request.session}"
  end
 
  get "/public" do
    "Public"
  end
 
  get "/logout" do
    warden.logout
    redirect "/public"
  end
 
  post "/unauthenticated" do
    out = warden.message
    out << " You need to login"
    out
  end
end
 
MyApp.run!