如何将用户限制为每个会话仅登录一次

时间:2014-09-03 作者:user59167

如何使用代码限制用户共享ID和密码以及多次登录?我想做的是不允许用户同时登录多次。

5 个回复
SO网友:jgraup

这将使用户在登录之前退出所有其他会话。本质上确保一个用户一次只允许一个会话。

add_filter(\'authenticate\', \'wpse_12282015_single_login_authenticate\', 0, 3);

function wpse_12282015_single_login_authenticate($user, $username, $password) {

    $user =  get_user_by(\'login\', $username);

    if( isset($user->ID) ){

        if(isset($user->roles) && is_array($user->roles)) {

            //check for admins
            if(in_array(\'administrator\', $user->roles)) {

                // admin can log in more than once
                return $user;
            }
        }

        // get all sessions for user
        $sessions = WP_Session_Tokens::get_instance($user->ID);

        // destroy everything since we\'ll be logging in shortly
        $sessions->destroy_all();
    }

    return $user;
}

SO网友:user137345
$sessions = WP_Session_Tokens::get_instance( $user->ID );

if ( $user->ID === get_current_user_id() ) {
    $sessions->destroy_others( wp_get_session_token() );
    $message = __( \'You are now logged out everywhere else.\' );
} else {
    $sessions->destroy_all();
    /* translators: %s: User\'s display name. */
    $message = sprintf( __( \'%s has been logged out.\' ), $user->display_name );
}
SO网友:Mark Kaplun

这里的主要问题是HTTP没有会话,因此需要在更高级别引入一些会话开始和结束。wordpress定义会话的方式是在登录后或注销前2天。

问题是,用户很少注销wordpress,这意味着一旦用户登录,就不可能在两天内从另一台计算机使用其帐户,甚至在同一台计算机上的另一个浏览器,即使是同一用户再次尝试访问。

因此,这里的魔鬼在于细节,你如何防止登录会话永远持续下去,可能以用户体验为代价,或者用户如何从另一个浏览器“关闭”会话。Robert(和Otto)的回答是完全错误的,你可以使用现有的钩子来实现这一点,但天真的方法(例如设置用户登录时的过渡)可能会导致可用性灾难。

SO网友:ush

对于任何访问此页面寻找答案的人,有一个插件可以做到这一点:https://wordpress.org/support/plugin/loggedin/

SO网友:Robert hue

作者:Otto。

不,很简单。需要进行大量的黑客攻击。

WordPress在任何时候都不知道谁“登录”,因为没有任何系统可以以任何方式跟踪。登录时,浏览器上会设置一个cookie,其中包含用户名和表示密码的代码。每次访问该站点时,都会检查该cookie,并将您标识为您。

所以,这并不是说你要保持一个永久的联系或使用某种会话。你每次登录网站都是为了什么。

要想做你想做的事情,你必须重写大量的登录和身份验证系统来使用会话或类似的东西。

默认情况下,WordPress没有在数据库中存储会话的系统。

结束

相关推荐

user login and its profile

我想登录,注销和查看配置文件的功能。我目前能够登录用户并将其重定向到网站主页。我想在菜单和注销链接上显示loggedin用户名。为了获取当前登录用户的用户名,我尝试了以下方法:http://codex.wordpress.org/Function_Reference/wp_get_current_user但无法获取用户名。对于登录/注销链接,我在函数中使用了此代码。phpadd_filter(\'wp_nav_menu_items\', \'add_login_logout_link\', 10, 2);