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 desea proteger, agregue la condición :auth => :user
a ella, como en el ejemplo anterior /protected
. Eso llamará al método auth
, que agrega una condición a la ruta a través del condition
.
La condición llama al método is_user?
, que se ha definido como un ayudante. El método debe devolver verdadero o falso dependiendo de si la sesión contiene una identificación de cuenta válida. (Llamando ayudantes dinámicamente como esto hace que sea sencillo para añadir otros tipos de usuarios con diferentes privilegios.)
Por último, el manejador de before
establece una variable @user
instancia para cada solicitud de cosas como la que muestra el nombre del usuario en la parte superior de cada página. También puedes utilizar el helper is_user?
en sus puntos de vista para determinar si el usuario se registra en
Así que, aunque no voy a fingir que esto responde a su pregunta, voy a señalar que es intrínsecamente peligroso diseñar y desarrollar su propio esquema de autenticación. Hay muchos "hackers" que comienzan a babear cuando encuentran este tipo de cosas. Es mejor encontrar herramientas establecidas y comprobadas para hacer esto.No es un problema nuevo y ya hay muchas soluciones aceptables. – jaydel
Utilice la gema bcrypt. Puede generar hashes crípticos para contraseñas y si un hackie accedió a su base de datos, todo lo que obtienen son los hashes y no deberían funcionar para las contraseñas. En otras palabras, mantenlo de una manera. Verá mucho en bcrypt-ruby, pero ahora solo está en formato binario y es un tipo de extensión C, por lo que deberá compilarlo en Windows con algunas herramientas de desarrollo. Tienes razón, son voluminosos. https://sideprojectsoftware.com/blog/2015/02/22/sinatra-authentication debería ayudar. –