Вот очень простая схема аутентификации для Синатры.
Ниже я объясню, как это работает.
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
end
end
Для любого маршрута, который вы хотите защитить, добавьте к нему условие :auth => :user
, как в примере /protected
выше. Это вызовет метод auth
, который добавляет условие к маршруту через condition
.
Условие вызывает метод is_user?
, который был определен как помощник. Метод должен возвращать true или false в зависимости от того, содержит ли сеанс действительный идентификатор учетной записи. (Подобный динамический вызов помощников упрощает добавление других типов пользователей с различными привилегиями.)
Наконец, обработчик before
устанавливает переменную экземпляра @user
для каждого запроса на такие вещи, как отображение имени пользователя вверху каждой страницы. Вы также можете использовать помощник is_user?
в своих представлениях, чтобы определить, вошел ли пользователь в систему.