Sinatra: Как мне предоставить доступ к форме входа, не допуская доступа к остальной части моего приложения Sinatra? - PullRequest
2 голосов
/ 22 апреля 2010

Я недавно создал приложение Sinatra с формой входа (без базовой аутентификации). Чтобы запретить доступ к приложению, если пользователь не вошел в систему, я поставил блок before

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

Я быстро понял, что это помешало мне получить доступ к ресурсам в общедоступном каталоге, таким как моя таблица стилей и логотип, если только сначала не прошла аутентификацию. Чтобы обойти это, я изменил свой фильтр на следующее:

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

Если бы было много ресурсов, мне нужно было бы предоставить исключения для этого способа, чтобы они быстро стали подавляющими. Как лучше кодировать это, чтобы я мог делать исключения для общедоступного каталога или даже его отдельных подкаталогов и файлов, таких как /stylesheets, /images, /images/bg.png, но не /secret или /secret/eyes-only.pdf?

Или ... Есть ли совсем другая лучшая практика, чтобы справиться с этой ситуацией блокировки всего, кроме вещей, связанных с входом в систему (обработчики, представления, ресурсы)?

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Вы можете извлечь логику входа в систему в свое собственное промежуточное программное обеспечение Rack (которое может быть приложением Sinatra). Промежуточное программное обеспечение аутентификации будет обслуживать публичные файлы.

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('/') { ... }
0 голосов
/ 22 апреля 2010

Вместо того, чтобы помещать информацию авторизации непосредственно в ваше приложение Sinatra, почему бы вам не извлечь ее в Rack, используя Rack::Auth:

# my_app.ru



app = Rack::Builder.new do
  use Rack::Static, :urls => /^(stylesheets|javascripts|images|fonts)\//

  map '/login' do
    run MyApplication
  end

  map '/' do
    use Rack::Auth::Basic do |username, password|
      # check the username and password sent via HTTP Basic auth
    end
    run MyApplication
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...