是否逐个用户限制会话数量?

时间:2021-03-02 作者:Nikolaj

我找了又找,但都没找到-希望你能帮忙!

我正在为客户建立一个基于订阅的在线培训网站。这项服务迎合了将为其员工购买访问权的公司。该服务有不同类型的订阅,这取决于他们希望购买访问权限的员工数量——他们可以选择为10到15名、15到25名或25多名员工购买访问权限。

现在,问题是。。例如,如果一家公司为10-15名员工购买了访问权限,这些员工将共享相同的登录凭据。他们不会单独登录。

WHICH IS WHY I am looking for a way to limit the amount of sessions on an individual user-by-user basis.

我需要能够区分不同的层次和提供的服务。我能找到的插件只能选择限制整个站点上所有用户的会话量,而不能限制单个用户的会话量。

我希望我说得有道理。非常感谢所有帮助和意见!谢谢

1 个回复
SO网友:Antti Koskinen

每个人一个用户帐户肯定会更容易,但我认为您可以通过使用用户会话来实现这一点,用户会话存储为user_meta 使用session_tokens 钥匙也许是这样的。

add_action(\'template_redirect\', \'check_max_num_sessions\');
function check_max_num_sessions() {
    // Only check for logged in users
    if ( is_user_logged_in() ) {
        $current_user_id = get_current_user_id();

        // Get user sessions from user_meta
        $user_sessions = user_sessions($current_user_id);

        // Count sessions
        $ongoing_sessions = count_ongoing_sessions(
            $user_sessions
        );

        // Get max num of allowed sessions
        $max_sessions = max_num_sessions(
            $current_user_id
        );

        // Check, if limit exceeded
        if ( $ongoing_sessions > $max_sessions ) {

            // Destroy latest session
            destroy_latest_user_session(
                $current_user_id,
                $user_sessions
            );

            // Or destroy the current session, which may or may not be the latest
            // $session_manager = WP_Session_Tokens::get_instance(
            //  $current_user_id
            // );
            // $session_manager->destroy(
            //  wp_get_session_token()
            // );

            // Redirect user to an error page?
            // wp_redirect(
            //  max_num_sessions_error_page(),
            //  302
            // );
            // exit;
        }
    }

}

function user_sessions(int $user_id) {
    $meta = get_user_meta( $user_id, \'session_tokens\', true );
    return is_array($meta) ? $meta : array();
}

function destroy_latest_user_session(int $user_id, array $sessions) {
    array_pop(
        $sessions
    );
    return update_user_meta( $user_id, \'session_tokens\', $sessions );
}

function count_ongoing_sessions( array $sessions ) {
    // Time to compare sessions against
    $now = current_time(\'timestamp\');
    // Session counter
    $ongoing_sessions = 0;
    /**
        * Loop current user\'s sessions
        *
        * @var array $session
        * expiration int timestamp
        * ip string
        * ua (user agent) string
        * login int timestamp
        */
    foreach ($sessions as $session) {
        // Skip expired sessions
        if ( $session[\'expiration\'] < $now ) {
            continue;
        }
        // maybe some user agent checking here, if needed
        // code..
        // Increment counter
        $ongoing_sessions++;
    }
    return $ongoing_sessions;
}

function max_num_sessions( int $user_id ) {
    // Get from database?
    return 15;
}

function max_num_sessions_error_page() {
    return \'http://example.com\';
}
我没有找到直接的方法来破坏最近的会话WP_Session_Tokens. 这就是我直接获取和更新meta的原因。

启动最新会话后可能应该有一个重定向,因为在会话元更新后,用户似乎已经登录,直到用户导航到另一个页面或刷新当前页面,WP再次检查用户的登录状态。

相关推荐

Adding column to wpex_users

因此,我尝试向wpex\\u用户添加一列。由于某种原因,我不能。这是我的问题:ALTER TABLE wpex_users ADD nametest VARCHAR(200);这给了我一个错误,我的标准值是错误的。它为空。我不知道该怎么办。我真的需要这个新专栏。您知道我需要添加新列的查询吗?我用PHPMyAdmin编写查询。