2012-08-29 1 views
4

간단한 인증을 위해 http://railscasts.com/episodes/250-authentication-from-scratch을 따르고 있습니다. 그것은 예상대로 작동합니다. 다음과 같이레일 : 관련없는 개체를 파괴 한 후 사용자가 다음과 같이 로그 아웃했습니다. remote => true

<%= content_tag_for(:li, post) do %> 
    <%= link_to 'Delete', post, :confirm => 'Are you sure?', :method => :delete, :remote => true %> 
<% end %> 

그것은 index.html.erb 내에서 호출한다 : 나는 다음과 같은 partial 내 응용 프로그램에서 모델이

<%= render :partial => @posts.reverse %> 

개체가 성공적으로 파괴되는 경우 호출되는, 다음과 같이 destroy.js.erb입니다. delete 버튼을 클릭에

$('#<%= dom_id(@post) %>').css('background', 'red'); 
$('#<%= dom_id(@post) %>').hide(); 

post 객체가 제대로 삭제됩니다와 destroy.js.erb도 제대로 렌더링됩니다. 하지만 어떻게 든 사용자는 로그 아웃됩니다. 내 posts_controller.rb에 대한 코드는 다음과 같은 :

def destroy 
    logger.error 'in destroy' 
    @post = Job.find(params[:id]) 
    @post.destroy 

    respond_to do |format| 
     format.html { redirect_to(posts_url) } 
     format.xml { head :ok } 
     format.js 
    end 
    end 

모든 단서를 왜이 문제? :remote=>true 다음 세션이 어떻게 든 '경우

그리고, 나는 delete 링크에서 :remote => true를 제거하는 경우는, 다음 사용자 내가 어느 경우에 호출되지 않습니다 session에 대한 destroy 방법에 문을 로그인해야합니다. 로그인 만 남아 망했다. 쿠키를 검사 할 때 쿠키가 파괴되지 않았지만 메서드가 posts에 호출 될 때 쿠키가 수정된다는 사실을 발견했습니다. 이것이 일어날 이유가 확실하지 않습니다.

답변

4

Cross Site Request Forgery으로부터 보호하기위한 레일 보안 기능에 부딪 치는 것과 같은 소리가납니다. :remote => true을 추가하면 CSRF 보안 토큰이없는 ajax를 통해 요청이 제출되므로 CSRF 공격이라고 판단되기 때문에 레일스가 세션을 중단시킵니다. 이 문제를 얻으려면 당신은 몇 가지 옵션이 있습니다 :

  1. 신속하고 더러운 (안전하지 않은) 솔루션은 그 요청에 대한 보안 검사를 해제하는 것입니다. 컨트롤러의 상단이 부가 기능이 라인을 수행합니다

    skip_before_filter :verify_authenticity_token, :only => [:destroy]

  2. 보다 안전한 솔루션은 AJAX 호출로 CSRF 토큰을 제출하는 것입니다. 원격 연결을 button_to으로 변경하면이 작업이 자동으로 수행됩니다. 더 읽기 here.

    <%= button_to 'Delete', post, :confirm => 'Are you sure?', :method => :delete, :remote => true %>

  3. 또한 쿠키는 세션보다는 CURRENT_USER를 저장할 수 있습니다. 이것의 보안 함의는 앱의 세부 사항에 달려 있습니다.

+0

Rails 3.0.9에서'link_to_remote' 메소드가 정의되지 않았습니까? 나는'% = link_to_remote 'Delete', : url => url_for (post), : method => : delete, : confirm => '정말입니까?' %>'. – brayne

+0

옵션 # 1 & 3은 현재 시나리오에서는 불가능하지만 알아두면 좋습니다! 그리고,'button_to'도 훌륭하게 작동합니다 .. – brayne

+0

'link_to_remote'와 같이 보입니다. 나는 대답에서 그것을 제거했다. – Matthew