Skip to content

Instantly share code, notes, and snippets.

@syntacticsugar
Forked from mamantoha/sinatra-warden.rb
Created October 18, 2012 04:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save syntacticsugar/3909886 to your computer and use it in GitHub Desktop.
Save syntacticsugar/3909886 to your computer and use it in GitHub Desktop.
Warden integration with Sinatra and DataMapper - http://ruby-ua.blogspot.com/2011/10/warden-sinatra-datamapper.html
# -*- encoding: utf-8 -*-
require 'sinatra'
require 'slim'
require 'warden'
require 'dm-core'
require 'dm-migrations'
DataMapper::Logger.new(STDOUT, :debug)
DataMapper.setup(:default, "sqlite:///#{Dir.pwd}/project.db")
# Model and database table to hold administrator's usernames and passwords
#
class User
include DataMapper::Resource
property :id, Serial
property :username, String, :unique => true
property :password, String
# Public class method than returns a user oblect if the caller supplies the correct name and password
#
def self.authenticate(username, password)
user = first(:username => username)
if user
if user.password != password
user = nil
end
end
user
end
end
# finalize them after declaring all of the models
DataMapper.finalize
# wipes out existing data
DataMapper.auto_upgrade!
# create test user
#User.create(:username => 'user', :password => 'qwerty')
### Rack Setup
#
use Rack::Session::Cookie, :secret => "bla-bla-bla"
use Warden::Manager do |manager|
manager.default_strategies :password
manager.failure_app = FailureApp.new
end
###
### Session Setup
# Tell Warden how to serialize the user in and out of the session.
#
Warden::Manager.serialize_into_session do |user|
puts '[INFO] serialize into session'
user.id
end
Warden::Manager.serialize_from_session do |id|
puts '[INFO] serialize from session'
User.get(id)
end
###
### Declare Some Strategies
#
Warden::Strategies.add(:password) do
def valid?
puts '[INFO] password strategy valid?'
params['username'] || params['password']
end
def authenticate!
puts '[INFO] password strategy authenticate'
u = User.authenticate(params['username'], params['password'])
u.nil? ? fail!('Could not login in') : success!(u)
end
end
###
class FailureApp
def call(env)
uri = env['REQUEST_URI']
puts "failure #{env['REQUEST_METHOD']} #{uri}"
end
end
get '/' do
redirect '/login' unless env['warden'].user
slim :index
end
get '/login/?' do
slim :login
end
post '/login/?' do
if env['warden'].authenticate
redirect '/'
else
redirect '/login'
end
end
get '/logout/?' do
env['warden'].logout
redirect '/'
end
__END__
@@index
p Welcome, #{env['warden'].user.username}
a href='/logout' Log out
@@login
form action='/login' method='post'
ul
li#username
label Username:
br
input name='username' type='text'
li#password
label Password:
br
input name='password' type='text'
input type='submit' value='Log in'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment