2011-09-08 6 views
8

레일 부분 인 웹 앱과 Backbone 부분이 있습니다. 필자가 구현 한 주석 달기 시스템과 같은 것들은 대부분 자바 스크립트로 클라이언트 측에서 작성됩니다. Rails 백엔드는 JSON을 앞뒤로 전달하여 지속성을 처리합니다.클라이언트 측에서 현재 사용자 세션을 어떻게 관리합니까?

서버에서 페이지를 렌더링 할 때 누가 손쉽게 볼 수 있는지 처리 할 수 ​​있습니다.

등이 있습니다. 현재 사용자가 댓글 작성자 인 경우 특정 댓글을 삭제하는 링크 만 렌더링됩니다. 문제 없어.

그러나 클라이언트 측의 주석을 af30에 캐시 된 JavaScript templates을 사용하여 렌더링 했으므로 current_user에 액세스 할 수 없습니다. 현재 내 앱을 사용하는 사용자가 댓글 작성자인지 여부를 알 수 없으므로 내가 볼 수있는 내용을 제어 할 수 없습니다.

물론 내가 서버에서 승인하기 때문에 댓글을 삭제할 수 없지만 처음에는 링크가 보이지 않을 것입니다.

어떻게하면됩니까?

나는이 주제가 무수한 블로그에서 다루어 져야 했음이 틀림없는 것처럼 보일지라도 나는 찾을 수 없을 것 같아서이 주제에 대한 자료와 답변에 대한 링크를 좋아할 것입니다.

답변

7

나는 다음과 같은 방법을 사용하여 선호

클라이언트 측 개인에 대한 더 자세한 팁은 "클라이언트 측 캐시 개인화"에서이 포스트를 참조하십시오.

<script type="text/javascript"> 
    window.currentUser = { 
     id : "<%=current_user.id%>" 
    } 
</script> 

그것은 당신의 EJS 템플릿에 액세스 할 수 있습니다 :

는 우선, 서버 측에서 생성 된 레이아웃에, 당신은 클라이언트 측에서해야 현재 사용자의 데이터를 전달합니다.

<% if (window.currentUser && window.currnetUser.id == comment.author.id) { %> 
    <a class="delete" href="some delete url">Delete Comment</a> 
<% } %> 
+1

이 접근 방식을 사용하면 절약 할 수 있습니까? 사용자가 현재 사용자의 ID를 변경할 수 있습니다 – ecleel

+0

사용자가 ID를 변경하고 삭제를 시도하더라도 사용자가 401 측면에서 권한이없는 오류를 표시 할 수 있도록 서버 측 보호 기능이있는 경우 사용하는 것이 안전합니다. 삭제 버튼을 표시하거나 표시하지 않는 것은 보안이 아닌 사용자 편의를위한 것입니다. – AwDogsGo2Heaven

0

Ryan Bates는이 사례에 대한 일반적인 관행을 설명합니다. Dynamic Page Caching을 사용하면 페이지 캐싱을 사용할 때 도움이되지만 서버 측에서 무언가를 얻어 처리해야합니다.

"삭제"링크없이 페이지를 렌더링하려고 할 때 사용자 세션 여부를 확인하고 결과를 변수에 할당하려고합니다. 구현의

하나, 조금 더 깊이 :

# controller 
    class UserSessionController < ActionController::Base 
    skip_before_filter :require_user, :only => [:new, :create, :user_sign_in] 

    def user_sign_in 
     if current_user 
     render :text => 'success' 
     else 
     render :text => 'false', :status => 403 
     end 
    end 
    end 


    class CommentsController < ApplicationController 
    def has_right 
     current_user == @comment.author 
    end 
    end 


    # view 
    <% javascript_tag do %> 
    var a = $.getJSON('/user_session/user_sign_in', function(data){ 
     console.log(data) 
    }); 

    <% end %> 

그런 다음 결과 및 숨기기/표시 댓글 된 div를 처리합니다.

+0

당신은, "API 제공자"와 같은 서버 측에 대해 생각할 수있는만큼 많은 자바 스크립트를 수행 주로 – Anatoly

+0

진짜보다 더 나은 패턴이 아니다 : 이제 템플릿에, 당신은 서버 측에서와 같은 검사를 할 수 있습니다 이? 예를 들어, 페이지에 수백 개의 주석이있는 경우 모든 페이지로드가 서버에서 멈출 것입니다. – JofoCodin

+0

맞습니다. 서버 측에서 수백 번을 가져 와서 모든 주석에 대한 권한을 확인하는 좋은 방법은 없습니다. 'comments': {id : '1', permission : true} 구조로 JSON을 가져 와서 JSON 데이터 구조를 기반으로 로직을 개발할 수 있습니다. – Anatoly

2

때로는 클라이언트 측 개인 설정이라고도합니다. 그것은 CSS 클래스를 사용하여 자바 스크립트가 쿠키 또는 아약스 요청에서 가져 오는 값을 기반으로 요소를 숨기고 확실하게 표시합니다.

캐싱 레이어를 래핑하는 랙 미들웨어에 설정된 쿠키의 사용자 상태, 이름 및 기타 키 데이터를 설정하는 것이 좋습니다. 이렇게하면 사용자 세션의 논리를 캐시 된 데이터에서 격리 할 수 ​​있습니다. 그런 다음 자바 스크립트를 사용하여이 쿠키를 읽고 필요에 따라 페이지를 변경합니다. 주석 예제의 경우, 데이터 속성에서 ID (또는 보안 의미에 대해 염려하지 않는다면 ID)의 다이제스트로 각 주석을 렌더링합니다 (예 :

).
<div class="comment_203948">...</div> 

위의 쿠키에 사용자의 의견 ID를 저장하십시오. 그런 다음 javascript는 쿠키를 읽고 해당 ID로 모든 주석을 찾은 다음 해당 태그에 대한 '삭제'링크를 표시합니다.

이 접근법에 공통적으로 발생하는 문제는 쿠키가 넘칠 때 발생합니다. 예를 들어 다작의 주석 작성자가이 예제에서 발생합니다. 또 다른 방법은 ajax를 사용하여 사용자의 관련 JSON 데이터를 가져온 다음 로컬 저장소에 캐시하는 것입니다.저는 after_save 콜백 및 기타 캐시 만료 전략을 사용하여 서버 측에서 업데이트 할 수있는 쿠키에 사용자의 JSON 데이터 버전을 유지하는 것과 결합하는 것을 좋아합니다. Javascript는 로컬 저장소에있는 사용자의 JSON 상태를 쿠키의 버전과 비교하고,이 JSON을 오래된 경우 AJAX 요청을 통해 새로 고칩니다. http://www.tumblr.com/tagged/caching

이 하나 : http://pivotallabs.com/users/nick/blog/articles/297-making-rails-wicked-fast-pagecaching-highly-personalized-web-pages

관련 문제