检查用户是否已获得授权(HTTP基本身份验证,Rails 3.0.9)

时间:2011-10-03 15:43:51

标签: ruby-on-rails-3 http-basic-authentication

我正在使用Rails 3.0.9的HTTP基本身份验证,我需要检查用户是否有权在我的html.erb文件中显示一些元素。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:10)

Vitaly的方法看起来是一个很好的解决方案,但是有一个严重的错误,即使他们的凭据不正确,也会向尝试登录的任何人授予管理员访问权限。 (发布这个作为答案,希望它得到投票,人们不会盲目接受“安全漏洞”的“正确”答案)

首先,进行一些功能测试(需要进行身份验证的操作):

test "admin is set with correct credentials" do
  @request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("user", "pass")
  get :index
  assert_response 200
  assert_equal true, session[:admin]
end

test "admin isn't set with incorrect credentials" do
  @request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("user", "incorrect")
  get :index
  assert_response 401
  assert_not_equal true, session[:admin]
end

如果使用Vitaly的代码运行此代码,则第二次测试失败,因为session[:admin]被设置为true,即使密码不正确。

这是我的代码,用于正确设置session[:admin]并使两个测试都通过:

private
def authenticate
  authenticate_or_request_with_http_basic do |user_name, password|
    session[:admin] = (user_name == "name" && password == "pass")
  end
end

答案 1 :(得分:0)

您可以使CanCan使用基本身份验证,阅读本指南https://github.com/ryanb/cancan/wiki/changing-defaults,然后通常只使用CanCan,您可以根据登录的用户名设置权限。