Qué es un esquema de autenticación muy simple para Sinatra / Rack


Estoy ocupado portando una aplicación web muy pequeña de ASP.NET MVC 2 a Ruby / Sinatra.

En la aplicación MVC, FormsAuthentication.SetAuthCookie se estaba utilizando para establecer una cookie persistente cuando el inicio de sesión de los usuarios se validaba correctamente en la base de datos.

Me preguntaba cuál sería el equivalente de Autenticación de formularios en Sinatra? Todos los marcos de autenticación parecen muy voluminosos y no son realmente lo que estoy buscando.

Author: AndrewVos, 2010-08-24

4 answers

Aquí hay un esquema de autenticación muy simple para Sinatra.

Explicaré cómo funciona a continuación.

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

Para cualquier ruta que desee proteger, agregue la condición :auth => :user, como en el ejemplo /protected anterior. Eso llamará al método auth, que agrega una condición a la ruta a través de condition.

La condición llama al método is_user?, que ha sido definido como un helper. El método debe devolver true o false dependiendo de si la sesión contiene un id de cuenta válido. (Llamar a helpers dinámicamente de esta manera hace que sea fácil agregar otros tipos de usuarios con diferentes privilegios.)

Finalmente, el controlador before establece una variable de instancia @user para cada solicitud para cosas como mostrar el nombre del usuario en la parte superior de cada página. También puede usar el ayudante is_user? en sus vistas para determinar si el usuario ha iniciado sesión.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-24 19:29:35

La respuesta de Todd no funciona para mí, y encontré una solución aún más simple para la autenticación simple muerta de una sola vez en Las preguntas frecuentes 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

Pensé que lo compartiría en caso de que alguien vagara por esta pregunta y necesitara una solución no persistente.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-13 03:52:04

He encontrado este tutorial y repositorio con un ejemplo completo, funciona bien para mí

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-19 19:49:06

Usé la respuesta aceptada para una aplicación que solo tenía 2 contraseñas, una para usuarios y otra para administradores. Acabo de hacer un formulario de inicio de sesión que toma una contraseña(o pin) y lo comparé con uno que había establecido en la configuración de sinatra (uno para administrador, uno para usuario). Luego establezco la sesión [: current_user] a admin o user según la contraseña que el usuario introdujo y autorizó en consecuencia. Ni siquiera necesitaba un modelo de usuario. Tuve que hacer algo como esto:

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

Como se menciona en la documentación de sinatra para que la sesión persista en chrome. Con eso añadido a mi archivo principal, persisten como se esperaba.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-14 17:10:59