2011-09-30 6 views
3

저는 현재 구축중인 사이트에서 최신 버전의 Codeigniter와 tank_auth 1.0.9를 사용하고 있습니다.탱크 인증을 사용할 때 리디렉션간에 플래시 데이터가 저장되지 않습니다.

set_flashdata() 및 flashdata()를 사용하는 경우 리디렉션시 아무것도 반환되지 않지만 구성에서 sess_use_database를 FALSE로 설정하면 작동합니다.

검색 한 결과 답변을 찾을 수 없습니다. - 다른 사람이이 문제에 부딪혀 해결 했습니까?

+1

Tank_Auth와 관련이 있습니까? 새로 설치를 시도 했습니까? –

+0

나는 log_message (..) 문을 넣고 브라우저가 만드는 각 http 요청에 대한 flashdata의 값을 확인하는 것이 좋습니다. codeigniter 내의 내부 리디렉션 (redirect() 사용)도 플래시 데이터를 지 웁니다. 로그 파일에서 원인이 될 수있는 잘못된 리디렉션()을 확인하십시오. – Shivaas

답변

0

tank_auth가 내부 리디렉션을 수행하면 해당 리디렉션 요청에서 플래시 데이터가 손실 될 수 있습니다.

2

나는 동일한 문제가있어서 그 문제를 알아 냈습니다. 데이터베이스에 세션을 저장하고 있으면 세션이 작동하지 않습니다. 는 인증 컨트롤러에서이 코드 ($this->_show_message())를 실행 다음

$this->delete_autologin(); 

// See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line 
$this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => '')); 

$this->ci->session->sess_destroy(); 

:

탱크 인증은 기본 라이브러리에서이 코드 ($this->tank_auth->logout())를 실행

$this->session->set_flashdata('message', $message); 
redirect('/auth/'); 

문제가를 그 sess_destroy() 가입일 flashdata를 설정하기 전에 실행되었으므로 flashdata를 추가 할 데이터베이스 행이 없으므로 flashdata가 설정되지 않습니다.

당신이 비어있는 새 세션을 생성하기 때문에이 작동 application/libraries/Tank_auth.php

에 기능 logout() 즉시 $this->ci->session->sess_destroy();$this->ci->session->sess_create(); 추가 : 1

옵션 :

는이 시점에서 몇 가지 해결책이 있습니다 여기서 플래시 데이터를 저장할 수 있습니다. 잠재적 인 문제는 데이터베이스에서 더 많은 작업을 수행하고 있다는 것입니다 (삭제 + 삽입).

옵션 2 :

을 주석 /은 CI가 flashdata를 추가하기 만 업데이트 쿼리를 수행 할 수 있도록, application/libraries/Tank_auth.php 세션이 파괴되지 않기 때문에이 작동

에 기능 logout()$this->ci->session->sess_destroy();을 삭제합니다. 세션을 완전히 제거해야하는 경우가 아니면 옵션 1보다 좋습니다.

옵션 3 :

FALSE$config['sess_use_database']를 설정합니다.

세션이 데이터베이스에 저장 될 때 작동하는 것과 달리 세션이 다시 요청 될 때 자동으로 만들어지기 때문에 작동합니다. 잠재적으로 덜 안전합니다.

마지막으로 귀하의 적용에 가장 적합한 옵션을 결정하는 것은 귀하에게 달려 있습니다.

0

정확히. CodeIgniter의 문서는 여기에 지정 I 시스템/라이브러리/Session.php 파일로 팠습니다 및 저장 flashdata 당신이 말한대로는 데이터베이스를 업데이트 sess_write() 방법을 트리거 http://codeigniter.com/user_guide/libraries/sessions.html

============================= 
Destroying a Session 

To clear the current session: 
$this->session->sess_destroy(); 

Note: This function should be the last one called, 
    and **even flash variables will no longer be available**. 
    If you only want some items destroyed and not all, use unset_userdata(). 
============================= 

.

0

더 나은 해결 방법은 show_message()에서 flashdata를 설정하기 전에 세션이 존재하는지 확인하는 것입니다.

function _show_message($message) 
{ 
    // Patch for show_message() after logout(). Make sure the session exist before set_flashdata(). 
    if(!$this->session->sess_read()) 
    { 
     $this->session->sess_create(); 
    } 
    $this->session->set_flashdata('message', $message);  
    redirect('/auth/');  
} 
관련 문제