禁用特定用户

时间:2017-02-24 22:21:16

标签: parse-platform parse-server

我正在尝试禁用特定用户帐户登录。我无法删除该帐户,因为用户应该能够在再次启用时访问所有旧记录。

我已经制作了一个解析服务器的分支并编辑了UsersRouter来实现我想要的。查看更改on my github fork。 Parse社区对这样的添加感觉如何?由于我找不到任何现有的解决方法,我想知道社区是否需要这样的东西。

现在我想知道是否有更好的方法来实现这一目标?我想到的另一个选择是创建一个云函数来处理登录并返回会话令牌,并结合客户端的become调用。但这也有其他负面影响。

所以问题归结为:在不删除用户的情况下在Parse中禁用用户的最佳方法是什么?

我已经在GitHub上的parse-server存储库中打开了an issue提案。

2 个答案:

答案 0 :(得分:0)

嗯,我讨厌解析服务器,也就是说,以下解决方案对我来说有些有用;

1)禁止用户:

import * as _ from 'underscore';
import * as randomstring from 'randomstring';
import { createReportQuery } from './reportQuery';
import mongoExecute from 'helpers/mongo';

export async function handleBanUserRequest(req, res) {

    const userId = req.body.userId;
    if (!userId) {
        res.status(400).send('User id cant be empty');
        return;

    }

    const user = await mongoExecute(async (db) => {
        return await db.collection('_User')
            .findOne({_id: userId});
    });

    await mongoExecute(async (db) => {
        return await db.collection('_User')
            .updateOne({_id: userId}, {
                $set: {
                    banned: true,
                    _acl: {},
                    _wperm: [],
                    _rperm: [],

                    acl_original: user._acl,
                    wperm_original: user._wperm,
                    rperm_original: user._rperm
                }
            });
    });

    await mongoExecute(async (db) => {
        return await db.collection('_Session')
            .remove({_p_user: `_User$${userId}`});
    });

    await mongoExecute(async (db) => {
        return await db.collection('_Installation')
            .remove({userId: userId});
    });

    res.json({});
}

2)取消禁止用户:

import * as _ from 'underscore';
import * as randomstring from 'randomstring';
import { createReportQuery } from './reportQuery';
import mongoExecute from 'helpers/mongo';

export async function handleUnbanUserRequest(req, res) {

    const userId = req.body.userId;
    if (!userId) {
        res.status(400).send('User id cant be empty');
        return;

    }

    const user = await mongoExecute(async (db) => {
        return await db.collection('_User')
            .findOne({_id: userId});
    });

    await mongoExecute(async (db) => {
        return await db.collection('_User')
            .updateOne({_id: userId}, {
                $set: {
                    banned: false,
                    _acl: user.acl_original,
                    _wperm: user.wperm_original,
                    _rperm: user.rperm_original,
                },

                $unset: {
                    acl_original: 1,
                    wperm_original: 1,
                    rperm_original: 1
                }
            });
    });

    res.json({});
}

在保存检查之前解析服务器:

Parse.Cloud.beforeSave(Parse.User, async function (request, response) {
    var user = request.object

    if (user.id == null) {
        user.set('admin', false)
        user.set('premium', false)
        user.set('credits', 0)
        user.set('matches', [])
    }
    else if (!request.master) {
    if (user.dirty('banned'))
        return response.error('You cant set the banned')

    if (user.dirty('acl_original'))
        return response.error('You cant set the acl_original')

    if (user.dirty('wperm_original'))
        return response.error('You cant set the wperm_original')

    if (user.dirty('rperm_original'))
        return response.error('You cant set the rperm_original')
    }

    response.success()
}

答案 1 :(得分:0)

从 v3.3.0 开始添加了 beforeLogin() 触发器: https://docs.parseplatform.org/cloudcode/guide/#beforelogin

Parse.Cloud.beforeLogin(async request => {
  const { object: user }  = request;
  if(user.get('isBanned')) {
   throw new Error('Access denied, you have been banned.')
  }
});