2017-12-06 12 views
1

나는 MySQL에서 사용자 로그인 데이터를 가지고 있는데, 사용자는 세션에서 1 회만 로그인 할 수 있습니다. 로그 아웃 버튼을 사용하는 경우, 코드는 잘 실행하지만 사용자 만약 내가 두번째 로그인 사용자의 액세스를 차단 is_login을 사용하는 브라우저브라우저 강제 종료 또는 세션 만료 후 데이터베이스의 로그인 상태 변경

// user_table in MySQL 
    user_id  user_username  user_password  is_login 
    1    xyzabc    xxxxx    0 // 0 is not 
    2    abcdef    xxxxx    1 // 1 is login 
    3    efghij    xxxxx    1 

을 닫고있다. 따라서 각 계정은 한 번만 로그인 할 수 있으며 is_loginis_login에서 0으로 로그인 세션에서 사용자를 걷어차는 데 사용됩니다. 사용자가 logout 기능을 사용하여 로그인 한 경우

// Inside my login function 
public function login() 
{ 
    ... some validation login code ... 
    // User ID accepted & login = TRUE 
    $this->session->set_userdata('id', $data->user_id); 
    // this query is in model, I just copy it to here 
    $this->db->query('UPDATE user_table SET is_login = "1" WHERE user_id = ".$id."'); 
    $this->session->sess_expiration = 7200; 
    $this->session->sess_expire_on_close = TRUE; 
} 

// Logout function in controller 
public function logout() { 
    $id = $this->session->userdata('id'); 
    // this query is in model, I just copy it to here 
    $this->db->query('UPDATE user_table SET is_login = "0" WHERE user_id = ".$id."'); 
    $this->session->sess_destroy(); 
} 

는 코드가 잘 실행하고 있습니다.

is_login 열은 0에 다시 설정됩니다. 그러나 브라우저 강제 종료 is_login 상태가 여전히 1 인 경우. 어떤 해결책? (11)

  • INT 사용자 테이블에 다른 열을 추가 is_login 열을 변경 @Tpojka로 나타낸 바와

  • +0

    당신은 로그인 시간과 관련된 테이블에 타임 스탬프 형식 열을 필요 : 사용자가 예제 함수 아래처럼 호출 페이지에 액세스 요청 지금 때마다

    function login($username, $password) { $result = false; // Check from DB that the username and password is valid or not // IF user is valid, retrieve user_id from DB If (USER_IS_VALID) { $_SESSION['user_id'] = $user_id; $_SESSION['dte_activity'] = time(); $_SESSION['dte_login'] = time(); $result = true; } return $result; } 

    좋아요. 또한, 그 값보다 오래된 모든 행의 상태가 변경되는 모든'$ sessionTimeSpanValue'를 cronjob하십시오. – Tpojka

    답변

    1
    1. 에 = 0 전류 경우 is_login 설정할 cronjob를 추가 최종 사용자 활동
    2. 를 도시 시스템 시간 및 마지막 사용자 활동이 만료 시간보다 큼
    3. 사용자가 로그인 할 때마다 PHP의 time() 값을 DB에 저장하십시오.
    4. 사용자 세션에 login time()과 동일한 값을 저장하십시오. 그래서 사용자가 페이지를 새로 고침 할 때마다 DB와의 세션에있는 값을 확인하여 사용자가 동일하다는 것을 알아야합니다. 그렇지 않다면 사용자를 로그 아웃하고 동일하게 파괴하십시오. 사용자가 다른 장치에서 로그인하여 현재 브라우저에서 로그 아웃해야 함을 의미 할 수도 있습니다.
    5. 사용자가 요청을 보내고 is_login 값이 DB에있는 값과 일치 할 때마다 사용자 세션에서 다른 값을 추가하고 업데이트하십시오. 예를 들어 dte_last_activity를 사용하면 세션이 만료되었는지 여부를 알 수 있습니다. 다른 만료 시간이 필요할 수 있으므로 서버의 세션 만기 시간에 의존하지 마십시오.

    좋아, 우리는 사용자 테이블 아래와 같이 있다고 가정 해 봅시다 :

    dte_login
    CREATE TABLE IF NOT EXISTS `system_users` (
        `id` smallint(5) unsigned NOT NULL, 
        `fullname` varchar(90) COLLATE utf8_persian_ci NOT NULL, 
        `username` varchar(40) COLLATE utf8_persian_ci NOT NULL, 
        `password` varchar(32) COLLATE utf8_persian_ci DEFAULT NULL, 
        `dte_login` int(11) unsigned NOT NULL DEFAULT '0', 
        `dte_activity` int(11) unsigned NOT NULL DEFAULT '0', 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci; 
    

    우리가 데이터베이스에 설정된 타임 스탬프 값이 때마다 dte_activity의 사용자 로그는 타임 스탬프 값입니다 마지막으로 사용자가 서버에서 무언가를 요청하고 코스를 빠져 나오면 로그인했습니다.

    참고 : dte_activity은 사용자가 여전히 활성 상태인지 확인해야하는 경우에만 필요합니다.

    function checkLogin() { 
        $result = false; 
    
        if (!empty($_SESSION['user_id'])) { 
         // This means that somebody is already logged in 
         $user_id = $_SESSION['user_id']; 
         $dte_login = $_SESION['dte_login']; 
    
         // We need to check if the user which is login is the same as the last user that used our website so we compare the dte_login value that we stored in session with what we have in DB 
         $db_connection->query("SELECT `id` FROM `system_users` WHERE `id`={$user_id} AND `dte_login`={$dte_login};");    
         // If the above query return no result, it means that someone else logged in meanwhile and we have to log out the current user 
    
         if ($db_connection->num_rows>0) { 
          // Now we need to check if his/her session is still valid or not 
          $EXPIERY = 300; // in seconds (in this case, 5 minutes) 
          $now = time(); 
          if ($now-$_SESSION['dte_activity']<$EXPIERY) { 
           // The user session is still valid and we need to update database 
           $db_connection->query("UPDATE `system_users` SET `dte_activity`={$now} WHERE id={$user_id};"); 
           $_SESSION['dte_activity'] = $now; 
    
           $result = true; // Means that someone is active 
          } else { 
           session_destroy(); 
          } 
         } else { 
          session_destroy(); 
         } 
        } 
    
        return $result; 
    } 
    
    +0

    먼저 코드를 사용해 보겠습니다. 코드를 사용하여 예제를 사용하면 정말 감사하겠습니다. 고맙습니다. – Cindy

    +0

    PHP 샘플 코드로 답변을 업데이트했습니다. 만료 된 사용자로부터 데이터베이스를 지우려면 cronjob도 추가해야합니다. 필요한 경우 코드를 추가합니다. – MohammadAli

    +0

    코드를 추가하려면 cronjob @MohammadAli에 대해 아는 것이 없습니다. 나는 정말로 당신의 도움에 감사 할 것입니다. 더 이상 말할 수있는 건 없지만 큰 감사합니다. – Cindy