Что такое очень простая схема аутентификации для Sinatra / Rack
Я занят портированием очень маленького веб-приложения из ASP.NET MVC 2-Ruby / Sinatra.
В приложении MVC, FormsAuthentication.SetAuthCookie использовался для установки постоянного файла cookie, когда логин пользователя был правильно проверен в базе данных.
Мне было интересно, какой эквивалент аутентификации форм будет в Sinatra? Все системы аутентификации кажутся очень громоздкими и не совсем то, что я ищу.
4 ответа:
Здесь представлена очень простая схема проверки подлинности для Синатры.
Я объясню, как это работает ниже.
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?
в ваших представлениях, чтобы определить, вошел ли пользователь в систему.
Ответ Тодда не работает для меня, и я нашел еще более простое решение для одноразовой мертвой простой аутентификации в FAQ Синатры :
require 'rubygems' require 'sinatra' use Rack::Auth::Basic, "Restricted Area" do |username, password| [username, password] == ['admin', 'admin'] end get '/' do "You're welcome" end
Я подумал, что поделюсь им на всякий случай, если кто-то забредет в этот вопрос и ему понадобится непостоянное решение.
Я нашел этот учебник и репозиторий с полным примером, он отлично работает для меня
Я использовал принятый ответ для приложения, которое просто имело 2 пароля, один для пользователей и один для администраторов. Я просто сделал форму входа, которая принимает пароль (или pin-код) и сравнил его с тем, который я установил в настройках sinatra (один для администратора, один для пользователя). Затем я установил сеанс [: current_user] либо admin, либо user, в соответствии с которым пользователь ввел пароль и авторизовался соответственно. Мне даже не нужна была модель пользователя. Я должен был сделать что-то вроде этого:
use Rack::Session::Cookie, :key => 'rack.session', :domain => 'foo.com', :path => '/', :expire_after => 2592000, # In seconds :secret => 'change_me'
Как упоминалось в документацияsinatra для сохранения сеанса в chrome. С добавлением этого в мой основной файл, они сохраняются, как и ожидалось.