hassox (owner)

Revisions

gist: 161180 Download_button fork
public
Public Clone URL: git://gist.github.com/161180.git
Embed All Files: show embed
login_form.haml #
1
2
3
4
5
6
7
8
9
%form{:action => '/login', :method => "post"}
  %p
    %label Username
    %input{:name => "username", :value => params[:username]}
  %p
    %label Password
    %input{:name => "password", :value => params[:password]}
  %p
    %input{:type => "submit", :value => "submit"}
login_spec.rb #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
require File.join(File.dirname(__FILE__), "server.rb")
require 'bacon'
require 'rack/test'
 
set :environment, :test
 
class Bacon::Context
  include Rack::Test::Methods
end
 
describe "Some Controller Test" do
  def app
    WardenHandler
  end
  
  it "allow a logged in user" do
    # I want to authenticate fred as a logged in user here
    post "/login", :username => "hassox", :password => "sekrit"
    last_response.should.be.redirect
    get '/'
    last_response.should.be.ok
  end
end
server.rb #
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
require 'rubygems'
gem 'sinatra-sinatra'
require 'sinatra'
require 'warden'
require 'haml'
 
class User
  def self.authenticate(username, password)
    return username if username == "hassox" && password == "sekrit"
  end
end
 
Warden::Manager.serialize_into_session{ |user| user }
Warden::Manager.serialize_from_session{ |user| user }
 
Warden::Strategies.add(:password) do
  def valid?
    params['username'] || params['password']
  end
 
  def authenticate!
    u = User.authenticate(params['username'], params['password'])
    u.nil? ? fail!("Could not log in") : success!(u)
  end
end
  
class WardenHandler < Sinatra::Default
  
  configure do
    use Rack::Session::Cookie
    use Warden::Manager do |manager|
      manager.default_strategies :password
      manager.failure_app = WardenHandler
    end
  end
    
  handler = lambda do
    # flash[:notice] = "That username and password are not correct!"
    status 401
    haml :login_form
  end
  get '/unauthenticated/?', &handler
  post '/unauthenticated/?', &handler
  put'/unauthenticated/?', &handler
  delete '/unauthenticated/?', &handler
  
  get "/dashboard" do
    env["warden"].authenticate!
    "YAY YOU'RE IN"
  end
  
  get "/" do
    env["warden"].authenticate!
    "YAY YOU'RE IN"
  end
  
  get '/login/?' do
    haml :login_form
  end
 
  post '/login/?' do
    env['warden'].authenticate!
    redirect "/"
  end
 
  get '/logout/?' do
    env['warden'].logout
    redirect '/login'
  end
  
  get "/protected" do
    env['warden'].authenticate!
    "Protected dude!"
  end
end