2011-10-03 17 views

Trả lời

10

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 
+0

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

0

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.

+0

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