2012-06-13 6 views
2

codeigniter 프레임 워크를 사용하고 있는데 tankauth 인증을 구현하려고합니다. 일반 페이지에서도 잘 작동합니다. 컨트롤러의 __construct에서 컨트롤러의 모든 기능을 보호 할 수 있도록 컨트롤러의 __construct에PHP 용 MVC 프레임 워크에서 컨트롤러 인증

을 입력합니다. 이 작업은 사용자의 자격 증명이 시간 초과되어 새 페이지를로드하려고하면 인증 페이지로 리디렉션되므로 다시 로그인 할 수 있습니다. 그러나 컨트롤러의 함수가 ajax를 통해 호출되는 경우 무한 루프가 발생합니다. 페이지가 이미로드되었을 때 리디렉션 헤더를 보내려고하기 때문에 나는 가정합니다.

로그인하지 않은 사람이 함수를 호출하려고하면 ajax 호출을 보호하고 인증 페이지로 리디렉션하는 올바른 방법은 무엇입니까?

감사합니다.

+0

끔찍한 방법으로 액세스 제어를 구현하십시오. –

답변

0

tankauth에 익숙하지 않으므로 더 좋은 방법이있을 수 있지만 일반적으로 컨트롤러에서 리디렉션을 호출하는 대신 메시지 (예 : JSON)를 반환 한 다음 스크립트를 종료해야합니다 , 리디렉션보다.

Ajax 호출을 만든 클라이언트 측 Javascript가 응답을 확인하고 사용자가 로그 아웃했다는 것을 나타내면 javascript를 사용하여 로그인 (window.location)으로 리디렉션합니다. Ajax를 통해 요청 된 페이지에서 리디렉션을 보내면 브라우저가 리디렉션되지 않고 Ajax 호출이 리디렉션을 따르기 만하면 Ajax 호출 결과는 로그인 페이지가 반환하는 HTML이됩니다.

그래서 다음과 같습니다

if (!authenticated) { 
    if (is_ajax_call) { 
     echo json_encode(array('error' => 'loggedout')); 
     exit; 
    } else { 
     redirect('auth'); 
    } 
} 

을 자바 스크립트는 응답이 error 키가 포함되어 있는지 여부를 확인하고,이 loggedout 인 경우, 그것은 당신의 로그인 페이지로 사용자의 브라우저를 리디렉션합니다.

+0

그래,이게 효과가 있다는 것을 알 수있다. 그러나 나는 이것을하기위한보다 깨끗한 방법이 있기를 희망했다. 내가 올바르게 이해한다면, 우리는 각 함수에 인증 스크립트를 추가하고 모든 javascript 함수에서 "오류"에 대한 핸들러를 추가해야합니다. __construct에 넣을 수있는 것이 있다면 매우 유용 할 것입니다. __construct는로드 된 페이지 (ajax 또는 기타)와 상관없이 사용자를 로그인 페이지로 강제 전송합니다. – user1452536

+0

불행히도 ajax를 사용하여 호출 페이지를 (자동으로) 리디렉션 할 수 없으므로 요청에 응답해야하거나 Ajax 호출시 데이터를 반환하지 않아도됩니다. – drew010

+0

감사합니다.이 방법이 가장 좋은 방법 인 것 같습니다. 내가 한 일은 결국 모든 자바 스크립트 아약스 호출에서 체크를 만드는 것이다. 호출은 결과가 인증 페이지인지 확인합니다. 그렇다면 drew010에서 제안한 것처럼 window.location을 사용하여 전체 페이지를 리디렉션합니다. 페이지가 아약스가 아닌 페이지로드와 같이 정상적으로 호출되면 시스템은 리디렉션을 제공하고 인증 로그인 페이지가 올바르게로드됩니다. 이것은 사용자가 로그인하지 않은 경우 로그인 페이지를 두 번로드해야하기 때문에 일종의 해킹입니다. – user1452536

관련 문제