Что такое очень простая схема аутентификации для Sinatra / Rack - PullRequest
38 голосов
/ 24 августа 2010

Я занят портированием очень маленького веб-приложения с ASP.NET MVC 2 на Ruby / Sinatra.

В приложении MVC FormsAuthentication.SetAuthCookie использовался для установки постоянного cookie-файла, когда пользователь входилправильно проверено на соответствие базе данных.

Мне было интересно, что будет эквивалент проверки подлинности с помощью форм в Синатре?Все рамки аутентификации кажутся очень громоздкими и не совсем то, что я ищу.

Ответы [ 4 ]

75 голосов
/ 24 августа 2010

Вот очень простая схема аутентификации для Синатры.

Ниже я объясню, как это работает.

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? в своих представлениях, чтобы определить, вошел ли пользователь в систему.

27 голосов
/ 29 марта 2012

Ответ Тодда у меня не работает, и я нашел еще более простое решение для одноразовой простой аутентификации в 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

Я думал, что поделюсь имна всякий случай, если кто-нибудь забрел на этот вопрос и нуждался в непостоянном решении.

6 голосов
/ 23 декабря 2013

Я нашел этот учебник и репозиторий с полным примером, он отлично работает для меня

https://sklise.com/2013/03/08/sinatra-warden-auth/

https://github.com/sklise/sinatra-warden-example

1 голос
/ 14 мая 2015

Я использовал принятый ответ для приложения, в котором было только 2 пароля: один для пользователей и один для администраторов. Я только что создал форму входа, которая принимает пароль (или пин-код), и сравнил его с тем, который я установил в настройках 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. После добавления этого файла в мой основной файл они сохраняются, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...