如何在没有控制器的情况下保护rspec_api_documentation apitome路由

时间:2014-04-10 16:21:31

标签: ruby-on-rails rspec devise

我有一组API文档页面,我想使用设计密码保护。使用rspec_api_documentation生成文档。 gem使用rspec来执行API方法并创建html或json doc文件。我正在生成json并使用另一个gem,apitome作为查看器。

这一切都运行得很好,我的api文档可以在/ api / docs找到,但我无法弄清楚如何要求身份验证来查看文档。

通过apitome查看文档,因此使用rails。 routes.rb中没有路由,但是apitom初始化程序会挂载文档。

来自apitom初始化程序:

# This determines where the Apitome routes will be mounted. Changing this to "/api/documentation" for instance would
# allow you to browse to http://localhost:3000/api/documentation to see your api documentation. Set to nil and mount
# it yourself if you need to.
config.mount_at = "/api/docs"

https://github.com/zipmark/rspec_api_documentation

https://github.com/modeset/apitome

我发现这个操作方法应该会使网站上的每个页面都需要验证,但我仍然可以在不登录的情况下点击文档网址。

#https://github.com/plataformatec/devise/wiki/How-To:-Require-authentication-for-all-pages

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

您可以控制Apitome控制器并请求身份验证。

  • 通过将mount_at设置为nil
  • 来将apitome配置为不挂载自身
  • 编写控制器ApidocsController,扩展Apitome :: DocsController
  • 添加before_filter:authenticate_user!在您的控制器中
  • 向您的控制器添加路线:获取'/ api / docs',以:'apidocs #index'

控制器实现将如下:

class ApidocsController < Apitome::DocsController
    before_filter :authenticate_user!
end

答案 1 :(得分:1)

如果您已配置Devise(例如,如果您已使用ActiveAdmin),则可以共享同一个经过身份验证的会话。

您必须禁用Apitome的默认安装:

# config/initializers/apitome.rb
Apitome.setup do |config|
  config.mount_at = nil
  # ...
end

由于这会破坏Apitome中的链接,您必须添加到您的application.rb:

# config/application.rb
# ...
class Application < Rails::Application
  config.after_initialize do
    Apitome.configuration.mount_at = '/docs'
  end 
  # ...
end

然后在Devise认证会话下强制安装Apitome引擎:

# config/routes.rb
Rails.application.routes.draw do
  # ...
  authenticated :admin_user do
    mount Apitome::Engine => '/docs'
  end
  # root_to ...
end

现在,只有经过身份验证的用户才能访问/ docs。

PS:将:admin_user(Active Admin的默认值)替换为:user或配置了Devise的任何其他型号名称。

答案 2 :(得分:0)

我正在使用降低的Rails API,因此没有任何视图或设计,因此没有简单的方法来实现密码保护。因此,我寻求以下解决方案。

Apitome.setup do |config|
  config.mount_at = nil
  # ...
end

,并在routes.rb文件中:

mount Apitome::Engine => '/api/docs' unless Rails.env.production?

最后,我只是制作了api / docs页面的pdf文件,然后将pdf文件发送给有权查看文档的任何人。显然不适合大型用户群,但对于小型用户群(例如在公司的IT部门中。