2011-10-03 2 views

답변

10

비탈리의 접근 방식은 좋은 해결책처럼 보이지만있다 자격 증명이 올바르지 않더라도 로그인을 시도하는 사람에게 관리자 권한을 부여하는 심각한 버그입니다.

:

첫째, (인증을 요구하는 행동에) 몇 가지 기능 테스트 (이 upvoted됩니다 사람들이 맹목적으로 보안 결함과 함께 "올바른"대답을 허용하지 않는 것이 희망의 응답으로이 게시)

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

감사합니다. 당신 말이 맞습니다. 어떻게 그런 실수를 저질렀는지. 많은 사람들이 그 영향을받지 않기를 바랍니다. 정답을 너무 늦게 바꾸어서 죄송합니다. 나는 그 통고에 주목하지 않았다. – Vitaly

0

당신은 기본 인증과 캉캉 작업을 할 수 있습니다,이 가이드 https://github.com/ryanb/cancan/wiki/changing-defaults을 읽고, 다음 당신이 로그인 한 사용자 이름에 따라 권한을 설정할 수 있습니다, 같은 일반적으로 캉캉를 사용합니다.

+0

하지만 비 필요한 복잡성을 추가합니다. 사용자가 로그온했는지 여부를 확인하기 위해 세션을 사용할 수 있는지 생각합니다. 어떤 아이디어? – Vitaly

관련 문제