wordpress bigspacer user access limit, 워드프레스 동시 접속 제한, 디바이스 대수 제한

워드프레스 동시접속 및 디바이스 접속 대수 제한(세션 및 네트워크 접속 제한) 플러그인

워드프레스를 이용하여 이러닝 플랫폼이나, 온라인 웹 애플리케이션을 개발할 때, 동시 접속 사용자를 차단해야하는 경우가 있습니다.

이런 경우 아래와 같은 플러그인을 통하여 사용이 가능합니다.

아래의 플러그인 예제 소스는 한 아이디당 5대의 다바이스 접속과 12시간 이후 자동으로 세션이 만료되는 기능을 수행합니다.

이 코드를 사용시, 로그인 에러 메시지에 대한 번역을 꼭 해주셔야 사용자의 혼란이 없어집니다.

 

/*
Plugin Name: 워드프레스 동시접속 및 디바이스 접속 대수 제한(세션 및 네트워크 접속 제한)
Version: 1.0.0
Author: BIGSpacer Data Store
Author URI: https://bigspacer.com/
Description: 워드프레스 동시접속 및 디바이스 접속 대수 제한(세션 및 네트워크 접속 제한).
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Description: 
워드프레스 동시접속 및 디바이스 접속 대수 제한(세션 및 네트워크 접속 제한)
*/

add_filter('authenticate', 'wp_authenticate', 1000, 2);

function wp_authenticate($user, $username){

    if(!username_exists($username) || !$user = get_user_by('login', $username))
        return null; // will trigger WP default no username/password matched error

    // setup vars
    $max_sessions = 5;
    $max_oldest_allowed_session_hours = 12;
    $error_code = 'max_session_reached';
    $error_message = "최대 $max_sessions 까지만 사용이 가능합니다.";

    // 1. Get all active session for this user
    $manager = WP_Session_Tokens::get_instance( $user->ID );
    $sessions =  $manager->get_all();

    // 2. Count all active session
    $session_count = count($sessions);

    // 3. Return okay if active session less then $max_sessions
    if($session_count < $max_sessions) return $user; $oldest_activity_session = wp_get_oldest_activity_session($sessions); // 4. If active sessions is equal to 5 then check if a session has no activity last 4 hours // 5. if oldest session have activity return error if( ( $session_count >= $max_sessions && !$oldest_activity_session ) // if no oldest is found do not allow
        || ( $session_count >= $max_sessions && $oldest_activity_session['last_activity'] + $max_oldest_allowed_session_hours * HOUR_IN_SECONDS > time())
    ){
        return new WP_Error($error_code, $error_message);
    }

    // 5. Oldest activity session doesn't have activity is given recent hours
    // destroy oldest active session and authenticate the user

    $verifier = wp_get_verifier_by_session($oldest_activity_session, $user->ID);

   wp_destroy_session($verifier, $user->ID);

    return $user;

}

function wp_destroy_session($verifier, $user_id){

    $sessions = get_user_meta( $user_id, 'session_tokens', true );

    if(!isset($sessions[$verifier]))
        return true;

    unset($sessions[$verifier]);

    if(!empty($sessions)){
        update_user_meta( $user_id, 'session_tokens', $sessions );
        return true;
    }

    delete_user_meta( $user_id, 'session_tokens');
    return true;

}

function wp_get_verifier_by_session($session, $user_id = null){

    if(!$user_id)
        $user_id = get_current_user_id();

    $session_string = implode(',', $session);
    $sessions = get_user_meta( $user_id, 'session_tokens', true );

    if(empty($sessions))
        return false;

    foreach($sessions as $verifier => $sess){
        $sess_string = implode(',', $sess);

        if($session_string == $sess_string)
            return $verifier;

    }

    return false;
}


function wp_get_oldest_activity_session($sessions){
    $sess = false;

    foreach($sessions as $session){

        if(!isset($session['last_activity']))
            continue;

        if(!$sess){
            $sess = $session;
            continue;
        }

        if($sess['last_activity'] > $session['last_activity'])
            $sess = $session;

    }

    return $sess;
}

// add a new key to session token array

add_filter('attach_session_information', 'wp_attach_session_information');

function wp_attach_session_information($session){
    $session['last_activity'] = time();
    return $session;
}

add_action('template_redirect', 'wp_update_session_last_activity');

function wp_update_session_last_activity(){

    if(!is_user_logged_in())
        return;

    // get the login cookie from browser
    $logged_in_cookie = $_COOKIE[LOGGED_IN_COOKIE];

    // check for valid auth cookie
    if( !$cookie_element = wp_parse_auth_cookie($logged_in_cookie) )
        return;

    // get the current session
    $manager = WP_Session_Tokens::get_instance( get_current_user_id() );

    $current_session = $manager->get($cookie_element['token']);

    if(
        $current_session['expiration'] <= time() // only update if session is not expired || ( $current_session['last_activity'] + 5 * MINUTE_IN_SECONDS ) > time() // only update in every 5 min to reduce db load
    ){
        return;
    }

    $current_session['last_activity'] = time();
    $manager->update($cookie_element['token'], $current_session);

}

댓글 남기기