2010-05-30 5 views
0

안녕하세요 여러분, 응용 프로그램 컨트롤러에서 필터 설정 전에 레일즈 응용 프로그램에서 루비를 사용하여 소유자 만 문서를 편집 할 수 있도록했습니다. 그러나 권한 확인은 항상 실패한 경우에도 실패합니다 . 다음은 코드입니다.은 필터가 예상대로 작동하지 않습니다.

def get_logged_in_user 
    id = session[:user_id] 
    unless id.nil? 
    @current_user = User.find(id) 
    end 
end 

def require_login 
    get_logged_in_user 
    if @current_user.nil? 
    session[:original_uri] = request.request_uri 
    flash[:notice] = "You must login first." 
    redirect_to login 
    end 
end 

def check_current_user_permission 
    require_login 
    logger.debug "user id is #{params[:user_id]}" 
    logger.debug "current user id is #{session[:user_id]}" 
    if session[:user_id] != params[:user_id] 
    flash[:notice] = "You don't have permission to do that." 
    redirect_to :controller => 'home' 
    end 
end 

주목할 코드는 check_current_user_permission에 있습니다. 다음은 내 로그 출력의 예입니다.

user id is 3 
current user id is 3 
Redirected to http://localhost:3000/home 
Filter chain halted as [:check_current_user_permission] rendered_or_redirected. 

누구에게이 문제가 발생했는지 알 수 있습니까? 분명히 3의 user_id는 세션의 user_id 3과 동일합니다. 무엇이 잘못 되었습니까?

+0

그냥 궁금해서 ... 인증 용으로 authlogic을 사용하고 있습니까? – DJTripleThreat

+0

또한 세션 [: user_id]이 '3'이고 params [: user_id]가 '3'이고 이들이 같지 않을 수도 있습니다. 나는이 문제를 가지고 있는데, 왜냐하면 두 개의 DateTime 객체가있을 때 .to_s가 같을지라도 어떤 이유로 든 평등하게 평가되지 않는 이유는 두 번째 다른 부분이기 때문입니다. – DJTripleThreat

+0

나는 그 DJTripleThreat를 시도 할 것이다 ... 또한 나는 인증을 위해 어떤 보석도 사용하지 않고있다. – Jimmy

답변

2

session[:user_id]이 '3'이고 params[:user_id]이 '3'이고 이들이 같지 않으면 어떨까요?

난 단지 2 개의 DateTime 개체가있어 .to_s가 같을지라도 같은 이유로 평가되지 않는 몇 가지 이유 때문에 두 번째 다른 부분 일 때만이 문제를 말합니다.

루비는 굉장한 언어이지만 약한 입력 기능 덕분에 약한 입력 기능이 있습니다.

도움이 되셨 다구!

+0

문자열이 아닌 정수로 변환하는 것이 더 좋을 것이라고 말하고 싶습니다. – alternative

+0

@ ~ mthepic, 나는 동의한다. 나는 문자열 형으로 변환하는 것이 보통하기 쉽도록 강력하게 형식화 된 언어로 작업하는 데 익숙하다. Ruby에서는 그렇지 않습니다. 내 게시물을 수정하겠습니다. – DJTripleThreat

관련 문제