我正在尝试禁用特定用户帐户登录。我无法删除该帐户,因为用户应该能够在再次启用时访问所有旧记录。
我已经制作了一个解析服务器的分支并编辑了UsersRouter
来实现我想要的。查看更改on my github fork。 Parse社区对这样的添加感觉如何?由于我找不到任何现有的解决方法,我想知道社区是否需要这样的东西。
现在我想知道是否有更好的方法来实现这一目标?我想到的另一个选择是创建一个云函数来处理登录并返回会话令牌,并结合客户端的become
调用。但这也有其他负面影响。
所以问题归结为:在不删除用户的情况下在Parse中禁用用户的最佳方法是什么?
我已经在GitHub上的parse-server存储库中打开了an issue提案。
答案 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.')
}
});