Tôi đang sử dụng Xác thực cơ bản HTTP với Rails 3.0.9 và tôi cần kiểm tra xem người dùng có được phép hiển thị một số thành phần trong html.erb của tôi không các tập tin. Làm thế nào tôi có thể làm điều đó?Kiểm tra xem người dùng có được ủy quyền (Xác thực cơ bản HTTP, Rails 3.0.9)
Trả lời
cách tiếp cận Vitaly của trông giống như một giải pháp tốt, nhưng có một lỗi nghiêm trọng cấp quyền truy cập quản trị cho bất kỳ ai cố gắng đăng nhập, ngay cả khi thông tin đăng nhập của họ không chính xác. (Viết bài này như một câu trả lời với hy vọng rằng nó sẽ được bỏ phiếu tán và mọi người không mù quáng chấp nhận câu trả lời "đúng" với lỗ hổng bảo mật của nó)
Đầu tiên, một vài thử nghiệm chức năng (về hành động yêu cầu xác thực):
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
Nếu bạn chạy mã này bằng mã Vitaly, kiểm tra thứ hai không thành công vì session[:admin]
đang được đặt thành true, ngay cả khi mật khẩu không chính xác.
Dưới đây là mã của tôi để thiết lập đúng session[:admin]
và làm cho cả hai bài kiểm tra qua:
private
def authenticate
authenticate_or_request_with_http_basic do |user_name, password|
session[:admin] = (user_name == "name" && password == "pass")
end
end
Bạn có thể làm cho công việc Cancan với auth cơ bản, đọc hướng dẫn này https://github.com/ryanb/cancan/wiki/changing-defaults, sau đó chỉ cần sử dụng Cancan như thường, bạn có thể thiết lập quyền dựa trên tên người dùng đăng nhập.
Nó có vẻ tốt đẹp, nhưng nó thêm phức tạp không cần thiết. Tôi nghĩ về tính khả dụng của phiên sử dụng để kiểm tra xem người dùng có đăng nhập hay không. Bất kỳ ý tưởng? – Vitaly
Cảm ơn bạn, bạn đã đúng. Làm thế nào mà tôi đã phạm sai lầm đó. Hy vọng không có nhiều người bị ảnh hưởng. Xin lỗi vì đã quá muộn với việc thay đổi câu trả lời đúng. Tôi chưa nhận thấy thông báo. – Vitaly