我正在使用Rails 3.0.9的HTTP基本身份验证,我需要检查用户是否有权在我的html.erb文件中显示一些元素。我怎样才能做到这一点?
答案 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,您可以根据登录的用户名设置权限。