33 votes

Qu'est-ce qu'un schéma d'authentification très simple pour Sinatra / Rack?

Je suis occupé à porter une très petite application Web d'ASP.NET MVC 2 vers Ruby / Sinatra.

Dans l'application MVC, FormsAuthentication.SetAuthCookie était utilisé pour définir un cookie persistant lorsque la connexion de l'utilisateur était correctement validée par rapport à la base de données.

Je me demandais quel serait l'équivalent de l'authentification par formulaires dans Sinatra? Tous les cadres d'authentification semblent très volumineux et ne correspondent pas vraiment à ce que je recherche.

64voto

Todd Yandell Points 8515

Voici un très simple schéma d'authentification pour Sinatra.

Je vais vous expliquer comment il fonctionne ci-dessous.

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

Pour tout itinéraire que vous souhaitez protéger, ajouter l' :auth => :user condition, comme dans l' /protected exemple ci-dessus. Qui va appeler l' auth méthode, ce qui ajoute une condition à la route via condition.

L'état des appels de l' is_user? méthode, qui a été défini comme une aide. La méthode doit retourner true ou false selon que la session contient un compte valide id. (Appel d'aides dynamiquement comme il est simple d'ajouter d'autres types d'utilisateurs avec des privilèges différents.)

Enfin, l' before gestionnaire met en place un @user variable d'instance pour chaque demande pour des choses comme l'affichage du nom de l'utilisateur en haut de chaque page. Vous pouvez également utiliser l' is_user? aide dans votre point de vue afin de déterminer si l'utilisateur est connecté.

25voto

Ralphleon Points 1941

La réponse de Todd ne fonctionne pas pour moi et j'ai trouvé une solution encore plus simple pour l'authentification simple et morte dans la FAQ de 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
 

Je pensais que je le partagerais au cas où quelqu'un s'égarerait sur cette question et aurait besoin d'une solution non persistante.

5voto

julianromera Points 401

J'ai trouvé ce tutoriel et ce référentiel avec un exemple complet, cela fonctionne très bien pour moi

http://skli.se/2013/03/08/sinatra-warden-auth/
https://github.com/sklise/sinatra-warden-example

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: