Co to jest bardzo prosty schemat uwierzytelniania dla Sinatra/Rack

Jestem zajęty portowaniem bardzo małej aplikacji internetowej z ASP.NET MVC 2 do Ruby / Sinatra.

W aplikacji MVC FormsAuthentication.SetAuthCookie był używany do ustawiania trwałego pliku cookie, gdy logowanie użytkowników zostało poprawnie zweryfikowane w bazie danych.

Zastanawiałem się, jaki byłby odpowiednik uwierzytelniania formularzy w Sinatrze? Wszystkie struktury uwierzytelniania wydają się bardzo nieporęczne i nie do końca to, czego szukam.

Author: AndrewVos, 2010-08-24

4 answers

Oto bardzo prosty schemat uwierzytelniania dla Sinatry.

Wyjaśnię, jak to działa poniżej.

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

Dla każdej trasy, którą chcesz chronić, Dodaj do niej warunek :auth => :user, Jak w powyższym przykładzie /protected. Spowoduje to wywołanie metody auth, która dodaje warunek do trasy via condition.

Warunek wywołuje metodę is_user?, która została zdefiniowana jako helper. Metoda powinna zwracać wartość true lub false w zależności od tego, czy sesja zawiera prawidłowy identyfikator konta. (Dynamiczne wywołanie helperów w ten sposób ułatwia dodawanie innych typów użytkowników z różnymi uprawnieniami.)

Wreszcie, Obsługa before ustawia zmienną instancji @user dla każdego żądania, na przykład wyświetlając nazwę Użytkownika na górze każdej strony. Możesz również użyć helpera is_user? w swoich widokach, aby określić, czy użytkownik jest zalogowany.

 74
Author: Todd Yandell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-24 19:29:35

ODPOWIEDŹ Todda nie działa dla mnie, a znalazłem jeszcze prostsze rozwiązanie dla jednorazowego uwierzytelniania dead simple w Sinatra ' s 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

Pomyślałem, że podzielę się nim na wypadek, gdyby ktoś błądził po tym pytaniu i potrzebował nietrwałego rozwiązania.

 27
Author: Ralphleon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-13 03:52:04

Znalazłem ten tutorial i repozytorium z pełnym przykładem, jego działa dobrze dla mnie

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

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

 5
Author: xyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 19:49:06

Użyłem zaakceptowanej odpowiedzi dla aplikacji, która właśnie miała 2 hasła, jedno dla użytkowników i jedno dla administratorów. Właśnie zrobiłem formularz logowania, który przyjmuje hasło (lub pin) i porównałem je z jednym, które ustawiłem w Ustawieniach (jeden dla administratora, jeden dla użytkownika). Następnie ustawiłem sesję [: current_user] na admin lub user, zgodnie z którym hasło użytkownik wprowadził i odpowiednio autoryzował. Nie potrzebowałem nawet modelu użytkownika. Musiałem zrobić coś takiego:

use Rack::Session::Cookie, :key => 'rack.session',
                       :domain => 'foo.com',
                       :path => '/',
                       :expire_after => 2592000, # In seconds
                       :secret => 'change_me'

Jak wspomniano w dokumentacja Sinatry , aby sesja była utrzymywana w chrome. Z tym dodanym do mojego głównego pliku, utrzymują się zgodnie z oczekiwaniami.

 1
Author: Josh Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-14 17:10:59