Ruby 1.9.2 + Sinatra - требует аутентификации на определенных маршрутах - PullRequest
0 голосов
/ 24 октября 2011

Прежде чем я начну, это в основном порт существующей службы стиля ASP.MVC REST для Sinatra.Я довольно новичок в Ruby, так что пока не знаю лучших практик, и сеть, похоже, немного взволнована по этому вопросу.

Так что в настоящее время во вкусе ASP у нас есть некоторые контроллеры, такие как:

public class MyController : Controller
{
    [Authenticate]
    public ActionResult AccessSecretStuffs()
    {...}

    public ActionResult AccessPublicStuffs()
    {...}
}

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

Теперь на земле Ruby, использующей Sinatra, у вас, как правило, нет контроллеров, все является действием, а мы просто хотим разоблачитьДанные в спокойном виде это кажется великолепным.Однако я должен быть в состоянии убедиться, что всякий раз, когда определенные маршруты вызываются с помощью Sinatra, он сначала будет вызывать немного кода, чтобы проверить, могут ли они получить доступ к действию, а затем, если нет, перенаправить их на страницу входа.

Я думал о том, чтобы просто добавить AOP для этого, но после небольшого прочтения все говорят, что Ruby не нужен AOP и уже предоставляет большинство функций из коробки.Так может кто-нибудь пролить свет на лучшую практику для этого?

В документации Sinatra есть метод before, который был бы применим, но тогда мне нужно было бы сделать метод before для любого другого метода маршрута, который не идеален,На мой взгляд, я просто хочу объявить маршрут, а затем поставить в конце какую-то аннотацию / атрибут, который указывает, что что-то должно произойти ...

Надеюсь, что это имеет какой-то смысл:)

1 Ответ

3 голосов
/ 24 октября 2011

Ruby не имеет аннотаций как таковых, но Sinatra предоставляет настраиваемые механизмы фильтрации.

При определении маршрута вы можете задать дополнительные условия, такие как различные значения заголовка и еще много чего.Вы также можете определить пользовательские условия:

set(:auth) do |*roles|   # <- notice the splat here
    condition do
        unless logged_in? && roles.any? {|role| current_user.in_role? role }
            redirect "/login/", 303 
        end
    end
end

Затем вы можете определить маршрут следующим образом:

get "/secret", :auth => [:user, :admin] do
    ...
end

или, если вам не нужно передавать какие-либо аргументы, прежде чем блок сможет принятьпуть в качестве аргумента:

before '/secret/*' do
    authenticate!
end

Вы можете прочитать больше на Страница readme Синатры

...