2012-07-25 3 views
6

Im CakePHP 2.2.1을 사용하고 Auth Component으로 사용자 인증을 향상 시키려고합니다. 사용자가 여러 위치에서 로그인하려고 할 때 개별 세션 ID를 얻으려고하면 이전 세션을 종료하여 동시에 여러 위치에서 로그인 할 수 없습니다.CakePHP 체크 세션이 데이터베이스에 존재합니다

CakePHP가이 게시물 cakephp prevent user login from multiple locations at the same time을 사용하여 세션을 저장하는 방법을 변환했지만 새 세션이 생성 될 때 이전 세션을 종료하는 방법에 대한 응답이 없습니다.

세션 모델을 만들고 레코드를 선택하기 위해 생각했지만 안전한 경로가 있는지 확실하지 않습니다.

나는 또한 Session Component과 CakeSession Datasource의 CakePHP 문서를 통해 힌트가있을 것이라고 기대했지만 아무것도 찾을 수 없었습니다.

모든 조언을 주시면 감사하겠습니다.

답변

6

일반적으로 세션 처리를 데이터베이스로 전환하려는 경우 동일한 사용자가 다른 session_id으로 로그인 한 것을 감지하면 부실 세션을 삭제할 수 있습니다.

Configure::write('Session.save', 'database'); 
  • 당신은 다음을 볼 것입니다

    cd app   
    Console/cake schema create Sessions 
    

    cake_sessions 테이블을 작성

    1. 스위치 세션이 데이터베이스에 처리 :

      단계는 당신에게 아이디어를 제공합니다 :

      ,
      Cake Schema Shell 
      --------------------------------------------------------------- 
      
      The following table(s) will be dropped. 
      cake_sessions 
      Are you sure you want to drop the table(s)? (y/n) 
      [n] > y 
      Dropping table(s). 
      cake_sessions updated. 
      
      The following table(s) will be created. 
      cake_sessions 
      Are you sure you want to create the table(s)? (y/n) 
      [y] > y 
      Creating table(s). 
      cake_sessions updated. 
      End create. 
      
    2. 당신이 세션 데이터베이스에

      $this->Session->write('user_id', 123456); 
      
    3. 으로 반복 필드 data을 통해에 의해 user_idsession_id 바인딩과 같은 user_id 사이트를 입력하면 해제하고 다른 session_id로 행을 삭제 가정.

      불행히도 CakePHP는 dataserialize() -ed 데이터로 저장합니다. cake_sessions 테이블에있는 각 행을 반복하여 삭제하고 data에 포함 된 user_id과 일치하는을 찾으십시오.

      또는 당신에게 아이디어를 제공하기 위해, 당신은 관련 행 삭제하는 대략 방법에 대해 다음 SQL을 사용할 수 있습니다

      DELETE FROM `cake_sessions` WHERE `cake_sessions`.`data` LIKE '%123456%'; 
      
    4. 그런 식으로 이전 session_id 의지를 가지고 이전 사용자를 로그인 한 사용자로 사이트에서 계속할 수 없습니다.

  • +0

    그래서 기본적으로 CakePHP의 기본 SessionComponent 또는 AuthComponent로 사용자 세션을 감지 할 수있는 방법이 없습니다. 위에서 언급 한 것처럼 세션이 데이터베이스에 쓰여지는 시점에서 이미 사용자에게 인증하기 전에 레코드에 액세스하려고 시도하고 있으며 CakePHP가 이것을 지원했는지 또는 내가 수동으로 처리해야하는지 알지 못했습니다. DELETE 쿼리 – Dastca

    +0

    수동으로해야합니다. CakePHP는 "out of the box"기능을 지원하지 않습니다. – uzyn

    +0

    괜찮습니다. 알려 주셔서 고마워요. – Dastca

    3

    다른 방법은 사용자 테이블에 session_id 필드를 만들고 로그인 한 후 사용자가 현재 세션 ID를 저장하는 것입니다.

    각 페이지에서 session_id가 현재 session_id와 같지 않으면 모든 세션 데이터를 삭제하고 이전 세션 데이터이거나 동시 세션이어야하므로 로그인 페이지로 리디렉션하십시오.

    참고 : 사용자 테이블의 세션이 현재 세션인지 확인한 후 세션 ID를 다시 생성 할 때도 사용자 테이블의 session_id 필드를 업데이트해야합니다. 그렇지 않으면 세션이 재생성 될 때마다 사용자가 로그 아웃됩니다.

    +0

    Uzyns 솔루션이 내 프로젝트에 좀 적합하다고 생각하지만이 솔루션을 선호합니다. LIKE를 사용하여 데이터를 찾는 "추한"쿼리를 사용하지 않고도 훨씬 더 간단하고 간단합니다. 감사 – Dastca

    관련 문제