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