gpt4 book ai didi

ruby - Sinatra:如何在阻止访问我的 Sinatra 应用程序的其余部分的同时提供对登录表单的访问权限?

转载 作者:太空宇宙 更新时间:2023-11-03 16:39:13 28 4
gpt4 key购买 nike

我最近创建了一个带有登录表单(无基本身份验证)的 Sinatra 应用程序。为了防止在用户登录之前访问该应用程序,我在适当的位置放置了一个 before block

before do
unless request.path_info == '/login'
authenticated?
end
end

我很快意识到这会阻止我访问公共(public)目录中的资源,例如我的样式表和 Logo ,除非先进行身份验证。为了解决这个问题,我将过滤器更改为以下内容:

before do
unless request.path_info == '/login' || request.path_info == "/stylesheets/master.css" || request.path_info == "/images/logo.png"
authenticated?
end
end

如果有很多资源,我需要提供异常(exception)情况,这种方式很快就会让他们不知所措。什么是更好的编码方式,这样我就可以为公共(public)目录甚至它的特定子目录和文件设置异常(exception),例如 /stylesheets/images/images/bg.png 但不是 /secret/secret/eyes-only.pdf

或者...是否有完全不同的最佳实践来处理这种锁定除与登录相关的内容(处理程序、 View 、资源)之外的所有内容的情况?

最佳答案

您可以将登录逻辑提取到它自己的 Rack 中间件(可以是 Sinatra 应用程序)中。身份验证中间件将为公共(public)文件提供服务。

require 'sinatra'

class Authentication < Sinatra::Base
def logged_in?
# your login logic goes here
end

get '/login' do
# login formular and logic here
end

get(//) do
pass if logged_in?
redirect '/login'
end
end

configure { |c| c.use Authenitcation }

get('/') { ... }

关于ruby - Sinatra:如何在阻止访问我的 Sinatra 应用程序的其余部分的同时提供对登录表单的访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2691997/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com