Как я могу вывести пользователя с сервера в Meteor.js?

В моем приложении Meteor.js я хочу, чтобы администратор смог принудительно выйти из системы.

Вариант использования заключается в том, что мое приложение обслуживает конечных пользователей, и служба открыта всякий раз, когда суперпользователь входит в систему. Если суперпользователь забыл явно выйти из системы, служба, похоже, будет открыта для конечных пользователей. Если администратор видит это, он/она должен иметь возможность принудительно выходить из системы вошедшего в систему пользователя и предоставлять услуги, закрытые для конечных пользователей.

Возможно ли это с Meteor.js? Если да, то как? Существуют ли лучшие/другие подходы к этому варианту использования?

EDIT: добавлены некоторые примеры удаленного выхода из системы, которые я пробовал, чтобы уточнить для @Akshat.

ПРИМЕР 1 (который не работает так, как я хочу):

В методе выхода из системы:

if (user.profile.role === ROLES.ADMIN) {
            Meteor
                .users
                .update({
                    _id: options.userId
                }, 
                { 
                    $set: { 
                        'services.resume.loginTokens' : [] 
                }});
        } else {
            throw new Meteor.Error(403, "You are not allowed to access this.");
        }

В моем приложении application.js:

var lastUserId;
Deps.autorun(function () {
    if(Meteor.user()) {
        if (Meteor.user().profile && Meteor.user().profile.firstName) {
            console.log("USER LOGGED IN");
            console.log("LENGTH LOGINTOKENS", 
                    Meteor
                        .user()
                        .services
                        .resume
                        .loginTokens.length); // This is always 1
            lastUserId = Meteor.user()._id;

            if (Meteor.user().services.resume.loginTokens.length === 0) {
                // This never fires, and thus the client does not know until
                // manually refreshed. Of course I could keep a forceLogOut-variable
                // as done in the next example.
                window.location.reload();
            }
        }
    } else {
        console.log("SOMETHING CHANGED IN METEOR.USER");
        if (lastUserId) {
            console.log("THE USER IS LOGGED OUT");
            Meteor.call('userLoggedOut',
            {
                userId: lastUserId
            });
            lastUserId = null;
        }
    }
});

ПРИМЕР 2 (это работает так, как я хочу, при использовании только forceLogOut вместе с Meteor.logout() на стороне клиента.):

В методе выхода из системы:

if (user.profile.role === ROLES.ADMIN) {
            Meteor
                .users
                .update({
                    _id: options.userId
                }, 
                { 
                    $set: { 
                        'services.resume.loginTokens' : [],
                        'profile.forceLogOut': true
                }});
        } else {
            throw new Meteor.Error(403, "You are not allowed to access this.");
        }

В моем приложении application.js:

var lastUserId;
Deps.autorun(function () {
    if(Meteor.user()) {
        if (Meteor.user().profile && Meteor.user().profile.firstName) {
            console.log("USER LOGGED IN");
            console.log("LENGTH LOGINTOKENS", 
                    Meteor
                        .user()
                        .services
                        .resume
                        .loginTokens.length); // This is always 1
            lastUserId = Meteor.user()._id;

            if (Meteor.user().profile.forceLogOut) {
                // Small example 1:
                // When logintokens have been set to [], and forceLogOut
                // is true, we need to reload the window to show the user
                // he is logged out.
                window.location.reload();
                // END Small example 1.

                // Small example 2:
                // When already keeping this variable, I might as well just use
                // this variable for logging the user out, and no resetting of
                // loginTokens are needed, or reloading the browser window.
                // This seems to me as the best way.
                console.log("FORCING LOGOUT");
                Meteor.logout();
                // END Small example 2.

                // And finally resetting the variable
                Meteor.call('resetForceLogOut',
                    {
                        userId: Meteor.user()._id
                    });
           }
        }
    } else {
        console.log("SOMETHING CHANGED IN METEOR.USER");
        if (lastUserId) {
            console.log("THE USER IS LOGGED OUT");
            Meteor.call('userLoggedOut',
            {
                userId: lastUserId
            });
            lastUserId = null;
        }
    }
});

Ответ 1

Вам нужно удалить все loginTokens из базы данных. Он сделает это для всех пользователей с этим запросом. Вы можете настроить селектор, если хотите выйти из меньшего подмножества пользователей или исключить текущего пользователя.

Meteor.users.update({}, {$set : { "services.resume.loginTokens" : [] }}, {multi:true});

Несколько вещей:

  • Это приведет к выходу всех пользователей, включая текущего пользователя.
  • Он работает только на стороне сервера.

Ответ 2

Выйдите из всех, но не текущий пользователь (вы):

Meteor.users.update({
    _id: {
        $ne: Meteor.user()._id
    }
}, {
    $set: {
        "services.resume.loginTokens": []
    }
}, {
    multi: true
});