What is a very simple authentication scheme for Sinatra/Rack What is a very simple authentication scheme for Sinatra/Rack ruby ruby

What is a very simple authentication scheme for Sinatra/Rack


Here is a very simple authentication scheme for Sinatra.

I’ll explain how it works below.

class App < Sinatra::Base  set :sessions => true  register do    def auth (type)      condition do        redirect "/login" unless send("is_#{type}?")      end    end  end  helpers do    def is_user?      @user != nil    end  end  before do    @user = User.get(session[:user_id])  end  get "/" do    "Hello, anonymous."  end  get "/protected", :auth => :user do    "Hello, #{@user.name}."  end  post "/login" do    session[:user_id] = User.authenticate(params).id  end  get "/logout" do    session[:user_id] = nil  endend

For any route you want to protect, add the :auth => :user condition to it, as in the /protected example above. That will call the auth method, which adds a condition to the route via condition.

The condition calls the is_user? method, which has been defined as a helper. The method should return true or false depending on whether the session contains a valid account id. (Calling helpers dynamically like this makes it simple to add other types of users with different privileges.)

Finally, the before handler sets up a @user instance variable for every request for things like displaying the user’s name at the top of each page. You can also use the is_user? helper in your views to determine if the user is logged in.


Todd's answer does not work for me, and I found an even simpler solution for one-off dead simple authentication in Sinatra's FAQ:

require 'rubygems'require 'sinatra'use Rack::Auth::Basic, "Restricted Area" do |username, password|    [username, password] == ['admin', 'admin']  endget '/' do    "You're welcome"end

I thought I would share it just in case anyone wandered this question and needed a non-persistent solution.