Http Basic Authenticate

作者:周星 发布:2017-10-07

    Http Basic Authenticate 提供了一种简便的方式来校验访问者的权限,今天我们来总结一下如何在 Rails 中使用它。
    Rails 提供了一个叫作 ActionController::HttpAuthentication::Basic 的模块,这个模块里定义了很多方法,如果只对某些请求做 Http Basic Authenticate,我们只要在 controller 里加上 http_basic_authenticate_with 方法即可。

class PostsController < ApplicationController
  http_basic_authenticate_with name: "dhh", password: "secret", except: :index

  def index
    render plain: "Everyone can see me!"
  end

  def edit
    render plain: "I'm only accessible if you know the password"
  end
end

上面的例子中直接写死了匹配的用户名和密码,如果匹配的用户名和密码是动态的,比如保存在文件中或者数据库中,那应该怎么做呢?我们可以通过 before_filter 配合 authenticate_with_http_basic/request_http_basic_authentication 方法来解决这个问题,请看下面这个例子:

class BlogsController < ApplicationController
  before_filter :authenticate

  def authenticate
    user = User.first
    unless authenticate_with_http_basic { |username, password| [username, password] == [user.name, user.password] }
      request_http_basic_authentication
    end

  def index
    ....
  end
end

在上面的例子中,可以直接使用 authenticate_or_request_with_http_basic 方法

...
def authenticate
  user = User.first
  authenticate_or_request_with_http_basic { |username, password| [username, password] == [user.name, user.password] }
end
...

ActionController::HttpAuthentication::Basic 提供了很多方法,如果您有更高级的需求,请看这里

如果想针对整个系统应用 Http 校验,是不是就要在每个 controller 里添加同样的代码呢?当然不是,Rails 实际上是一个“大”的 Rack 程序,我们直接在 Rack 上添加 Http 校验即可

# config/environments/development.rb
config.middleware.use Rack::Auth::Basic do |username, password|
  [username, password] == ['username', 'password']
end

这样所有的 Http 请求都需要经过 Http 校验了

同理,在一些非 Rails 程序,只需要在 config.ru 文件里加上这样一行代码就可以使用 Http 校验了:

use Rack::Auth::Basic { |u, p| [u, p] == ['username', 'password'] }

使用 Postman 或者 HttpRequester 往需要校验的 URL 发送请求时,只要在插件上选择 basic auth,输入对应的用户名密码即可。

支付宝扫码赞助博主


评论(1)

Qq1

高老庄第1楼

星哥,你知道 http_basic_authenticate_with 这个方法是怎么生成 js 弹出框的吗(输入用户名和密码)。

2016-03-03 21:09:01