-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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