[RUBY-ON-RAILS] 3 개 비활성화 세션 쿠키를 레일
RUBY-ON-RAILS3 개 비활성화 세션 쿠키를 레일
내가 RoR에 3에 기록하여 RESTful API가 있습니다. 나는 "SET-Cookie 헤더를"(클라이언트가 AUTH_TOKEN 매개 변수를 사용하여 권한을 부여하는) 보낼 수없는 내 응용 프로그램을 만들 수 있습니다.
내가 사용하는 세션에 시도 : 오프 reset_session하지만 이해가되지 않습니다. 나는 인증 프레임 워크로 유증을 사용하고 있습니다.
여기 내와 ApplicationController입니다
class ApplicationController < ActionController::Base
before_filter :reset_session #, :unless => :session_required?
session :off #, :unless => :session_required?
skip_before_filter :verify_authenticity_token
before_filter :access_control_headers!
def options
render :text => ""
end
private
def access_control_headers!
response.headers["Access-Control-Allow-Origin"] = "*"
response.headers["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS"
response.headers["Access-Control-Allow-Credentials"] = "true"
response.headers["Access-Control-Allow-Headers"] = "Content-type"
end
def session_required?
!(params[:format] == 'xml' or params[:format] == 'json')
end
end
해결법
-
==============================
1.로 전송되는 것을 세션 쿠키에 방해가되지 않는 세션을 삭제, 존의 답변에 대한 댓글에 언급되어있다. 당신이 완전히하여 전송되는에서 쿠키를 제거 할 경우, 랙 미들웨어를 사용해야합니다.
로 전송되는 것을 세션 쿠키에 방해가되지 않는 세션을 삭제, 존의 답변에 대한 댓글에 언급되어있다. 당신이 완전히하여 전송되는에서 쿠키를 제거 할 경우, 랙 미들웨어를 사용해야합니다.
class CookieFilter def initialize(app) @app = app end def call(env) status, headers, body = @app.call(env) # use only one of the next two lines # this will remove ALL cookies from the response headers.delete 'Set-Cookie' # this will remove just your session cookie Rack::Utils.delete_cookie_header!(headers, '_app-name_session') [status, headers, body] end end
다음과 같은 몸을 가진 초기화를 만들어 그것을 사용 :
Rails.application.config.middleware.insert_before ::ActionDispatch::Cookies, ::CookieFilter
완전히 시간에 혼동 될 수있는 애플리케이션 스택 추적에 결국 쿠키 필터를 방지하기 위해, 당신은 (당신이 lib 디렉토리 / cookie_filter.rb에 넣어 가정) 역 추적에 침묵 할 수 있습니다 :
Rails.backtrace_cleaner.add_silencer { |line| line.start_with? "lib/cookie_filter.rb" }
-
==============================
2.옵션 내장 사용합니다.
옵션 내장 사용합니다.
env['rack.session.options'][:skip] = true
또는 동등
request.session_options[:skip] = true
여기 https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb#L213 그것을 위해 문서를 찾을 수 있습니다
-
==============================
3.나는 그들이 고안에 추가 할 때 확실하지 않다, 그러나 AUTH_TOKEN를 사용할 때이 세션 쿠키의 전송을 해제하게됩니다 구성이있을 나타납니다 :
나는 그들이 고안에 추가 할 때 확실하지 않다, 그러나 AUTH_TOKEN를 사용할 때이 세션 쿠키의 전송을 해제하게됩니다 구성이있을 나타납니다 :
# By default Devise will store the user in session. You can skip storage for # :http_auth and :token_auth by adding those symbols to the array below. # Notice that if you are skipping storage for all authentication paths, you # may want to disable generating routes to Devise's sessions controller by # passing :skip => :sessions to `devise_for` in your config/routes.rb config.skip_session_storage = [:http_auth, :token_auth]
그것은 일을 잘한다. 만 나는 여전히 토큰을 생성 / 검색하기 위해 내 token_controller에 대한 초기 요청을 할 수있을 필요가 있다고했다 있었다 실행합니다. 즉 불행하게도 세션 쿠키를 야기 POST의 /api/v1/tokens.json는 해당 요청에 대해 반환한다.
나는 라이언 Ahearn 어쨌든 위의 쓴 것을 CookieFilter의 intializer을 구현 결국 그래서.
내 응용 프로그램은 웹 프런트 엔드뿐만 아니라 JSON API를 모두 가지고 있기 때문에 또한, 나는 단지 JSON API의 쿠키를 필터링하고 싶었다. 내가 처음 확인에 CookieFilter 클래스를 수정하도록 요청은 API를 소유 :
if env['PATH_INFO'].match(/^\/api/) Rack::Utils.delete_cookie_header!(headers, '_myapp_session') end
확실하지 그 일을 더 나은 방법이 있다면 ...
-
==============================
4.또 다른 방법 : 쿠키를 피하려고 컨트롤러,이 추가 :
또 다른 방법 : 쿠키를 피하려고 컨트롤러,이 추가 :
after_filter :skip_set_cookies_header def skip_set_cookies_header request.session_options = {} end
당신이 API를 컨트롤러의 집합이 경우, api_controller 클래스에서이 설정하고 다른 컨트롤러가 api_controller을 상속 할 수 있습니다.
세션 OPTS 이후 설정-Cookie 헤더 설정이 건너 뜁니다가 비어 있습니다.
-
==============================
5.뭔가가 세션에 추가되지 않는 한 기본 CookieSessionStore는 "SET-쿠키"헤더를 보내지 않습니다. 당신의 스택에 뭔가가 세션에 기록되어 있습니까? (이 고안 아마)
뭔가가 세션에 추가되지 않는 한 기본 CookieSessionStore는 "SET-쿠키"헤더를 보내지 않습니다. 당신의 스택에 뭔가가 세션에 기록되어 있습니까? (이 고안 아마)
세션 : 오프는 더 이상 사용되지 :
def session(*args) ActiveSupport::Deprecation.warn( "Disabling sessions for a single controller has been deprecated. " + "Sessions are now lazy loaded. So if you don't access them, " + "consider them off. You can still modify the session cookie " + "options with request.session_options.", caller) end
당신의 스택에 뭔가가 세션 정보를 설정하는 경우, 당신과 같이 session.clear를 사용하여 지울 수 있습니다 :
after_filter :clear_session def clear_session session.clear end
존재하여 전송에서의 Set-Cookie 헤더를 방지 할 수있는
-
==============================
6.당신이 CSRF 보호를 사용하는 경우 또한 요한의 대답에, 당신은 웹 서비스 요청이를 해제해야합니다. 당신은 응용 프로그램 컨트롤러 보호 방법으로 다음을 추가 할 수 있습니다 :
당신이 CSRF 보호를 사용하는 경우 또한 요한의 대답에, 당신은 웹 서비스 요청이를 해제해야합니다. 당신은 응용 프로그램 컨트롤러 보호 방법으로 다음을 추가 할 수 있습니다 :
def protect_against_forgery? unless request.format.xml? or request.format.json? super end end
(여부 - 환경에 config.action_controller.allow_forgery_protection = 참 / 거짓에 따라 다름)이 방법 HTML 요청은 여전히 CSRF를 사용합니다.
-
==============================
7.나 자신이 진정으로 선언적 (세션을 사용하여 : OFF) 세션을 해제 할 수있는 놓쳤다
나 자신이 진정으로 선언적 (세션을 사용하여 : OFF) 세션을 해제 할 수있는 놓쳤다
: 그냥 평범한 된 레일 (<= 2.2)처럼 사용을 - ... 따라서 나는 "다시"를 가져왔다
물론보다 session_off 세션 == 전무의 컨트롤러가 발생할 수 있기 때문에이 자신의 해킹 몇 가지 추가 유증의 특정 필요할 수 있습니다, 2.3 단순히 지금까지 전무을지지 않습니다 게으른 세션을 가정하기 때문에 대부분은 확장 레일.
https://github.com/kares/session_off
-
==============================
8.이모 가장 좋은 방법은 단순히 쿠키 세션 저장소 미들웨어를 제거하는 것입니다.
이모 가장 좋은 방법은 단순히 쿠키 세션 저장소 미들웨어를 제거하는 것입니다.
(필요한 경우 나 특정 환경에) 이렇게하려면, 당신 application.rb이 추가 :
# No session store config.middleware.delete ActionDispatch::Session::CookieStore
-
==============================
9.대신이 시도
대신이 시도
after_filter :skip_set_cookies_header def skip_set_cookies_header session.instance_variable_set('@loaded', false) end
세션 데이터를 변경하지 않은 경우 또는 더 나은, 항상 설정-Cookie 헤더를 제거
before_filter :session_as_comparable_array # first before_filter after_filter :skip_set_cookies_header # last after_filter def session_as_comparable_array(obj = session) @session_as_comparable_array = case obj when Hash obj.keys.sort_by(&:to_s).collect{ |k| [k, session_as_comparable_array(obj[k])] } when Array obj.sort_by(&:to_s).collect{ |k| session_as_comparable_array(k) } else obj end end def skip_set_cookies_header session.instance_variable_set('@loaded', false) if (@session_as_comparable_array == session_as_comparable_array) end
from https://stackoverflow.com/questions/5435494/rails-3-disabling-session-cookies by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 어떻게 부하는 루비에 필요 다릅니 까? (0) | 2020.02.19 |
---|---|
[RUBY-ON-RAILS] 내가 jQuery를 사용하여 레일에 데이터를 입력하려면 어떻게 (0) | 2020.02.19 |
[RUBY-ON-RAILS] 어떻게 MySQL과 포스트 그레스 모두 소문자를 구분하지 쿼리를 작성합니까? (0) | 2020.02.18 |
[RUBY-ON-RAILS] belongs_to 관계와 일에 fields_for와 accepts_nested_attributes_for 얻기 (0) | 2020.02.18 |
[RUBY-ON-RAILS] 어떻게 RVM을 사용하고 전 세계적으로 사용할 수 보석을 만들려면 어떻게해야합니까? (0) | 2020.02.18 |