当所有用户 ACL:Public 读/写被禁用时,如何检查用户名是否被 parse.com 使用? [英] How do I check if a username is taken with parse.com when all User ACL:Public read/write is disable?

查看:17
本文介绍了当所有用户 ACL:Public 读/写被禁用时,如何检查用户名是否被 parse.com 使用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当 ACL:Public read/write 在 User 类中的所有用户中禁用时,如何检查用户名是否被 parse.com Javascript SDK 使用?

说明:出于安全原因,我在 class/table User 中的所有用户都有一个 private ACL(访问控制列表),或者换句话说,公共读/写的 ACL 被禁用,这意味着经过身份验证的用户可以读取 <强>仅他们自己的信息.

您可以想象任何对用户的查询都会对未登录的用户变为空因此无法通过在用户类上使用查询来检查用户是否已被占用

我设法通过 singUp 一个新用户来解决这个问题,然后 Parse 将返回一个 400 错误和一些好的信息:

{code: 202, 错误:用户名测试已经进行"}

这种方法的问题在于,当用户在文本区域字段上输入时,我正在实时进行验证:

HTML AngularJS:

<h3>电子邮件</h3><input class="form-control"名称=电子邮件"placeholder="试试 john.doe@mail.com 或 bad@domain.com"类型=电子邮件"需要 ng-model="email"ng-model-options="{ 去抖动:100 }"ui-validate="{blacklist: 'notBlackListed($value)'}"ui-validate-async="{alreadyExists: 'doesNotExist($modelValue)'}"><span ng-show='form.email.$error.blacklist'>此电子邮件已列入黑名单!</span><span ng-show='form.email.$error.alreadyExists'>此电子邮件已已被接收!</b></span><span ng-show='form.email.$pending'>正在服务器上验证电子邮件...</span><br>表单有效:{{form.$valid}}</表单>

Javascript AngularJS:

$scope.doesNotExist = 函数(值){Parse.initialize(KEY0, KEY1);var deferral = $q.defer();var user = new Parse.User();user.set("用户名", "测试");user.set("密码", "anyapssword");用户注册(空,{成功:功能(用户){//万岁!现在就让他们使用该应用程序.console.log("成功!");//Holly shit 现在我必须删除用户 :( 并等待提交完整表格用户.销毁({成功:功能(我的对象){//该对象已从 Parse Cloud 中删除.console.log("销毁!!!!!!!!!!!!");},错误:函数(我的对象,错误){//删除失败.//error 是带有错误代码和消息的 Parse.Error.console.log("销毁失败!!!!!!!!!!!!");}});deferral.resolve(用户);},错误:函数(用户,错误){console.log("错误:" + error.code + " " + error.message);deferral.reject("mierda!");}});返回 deferral.promise;};

那么当 ACL:Public read/write 被禁用时,我如何检查用户名是否被 parse.com 使用?

我正在使用 AngularUI 插件进行快速验证:https://htmlpreview.github.io/?https://github.com/angular-ui/ui-validate/master/demo/index.html>

谢谢!

解决方案

我找到了自己的答案.如果有人在这里查看我在 AngularJS 和 Parse.com 中所做的事情.为了节省一些时间,我使用了来自 AngularUI 的 Validate 插件.

HTML:

<html lang="en" ng-app="demo"><头><meta charset="utf-8"><title>AngularJS ui-validate</title><script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.1/angular.js"></script><link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.css"/><script type="text/javascript" src="http://www.parsecdn.com/js/parse-1.6.14.min.js"></script><!-- ui-validate 文件--><script src="../dist/validate.js"></script><body class="容器"><脚本>var app = angular.module('demo', ['ui.validate']);app.controller('ValidateCtrl', function ($scope, $timeout, $q) {$scope.doesNotExist = 函数(值){Parse.initialize("uO...rPt", "8Bu...1mxFr");var deferral = $q.defer();Parse.Cloud.run('mgxIsNameAlreadyTaken', {username: value}, {成功:功能(结果){console.log("httpRequest resultado:" + result);//结果是 'Hello world!'延迟解决();},错误:函数(错误){console.log("si! ya esta tomado!:" + error);deferral.reject();}});返回 deferral.promise;//返回真;};});<section id="validate" ng-controller="ValidateCtrl"><div class="page-header"><h1>验证</h1>

<h3>什么?</h3><div class="row"><div class="col-md-6"><p><code>ui-validate</code>和<code>ui-validate-async</code>指令使创建变得非常容易自定义验证器表达式.</p><div class="well"><表格名称=表格"><h3>电子邮件</h3><input class="form-control"名称=电子邮件"placeholder="试试 john.doe@mail.com 或 bad@domain.com"类型=电子邮件"需要 ng-model="email"ng-model-options="{ 去抖动:500 }"ui-validate-async="{alreadyExists: 'doesNotExist($modelValue)'}"><span ng-show='form.email.$error.blacklist'>此电子邮件已列入黑名单!</span><span ng-show='form.email.$error.alreadyExists'>此电子邮件已已被接收!</b></span><span ng-show='form.email.$pending'>正在服务器上验证电子邮件...</span><span ng-show='form.email.$valid'>此电子邮件有效.</span><br>表单有效:{{form.$valid}}<br></表单>

</节></html>

解析云代码:

Parse.Cloud.define("mgxIsNameAlreadyTaken", function(request, response) {Parse.Cloud.useMasterKey();var query = new Parse.Query(Parse.User);query.equalTo("username", request.params.username);查询.第一({成功:功能(用户){如果(用户){response.error("用户名已被占用.");} 别的 {response.success("用户名"+request.params.username+"可用.");}},错误:函数(错误){console.error("用户查询错误." + error.code + " : " + error.message);response.error("mgxIsNameAlreadyTaken 中的错误:" + error.code + " : " + error.message);}});});

祝你好运!

How do I check if a username is taken with parse.com Javascript SDK when ACL:Public read/write is disable in all users inside User's class?

Explanation: For security reasons all my users in class/table User have a private ACL (Access control list), or in other words the ACL for public read/write is disable, it means that authenticated users can read only their own information.

As you can imagine any query to Users will get empty to non logged In users so there is no way to check if a user is already taken by using Query on User Class

I manage to work around this by singUp a new user and then Parse will return a 400 error with some good information:

{code: 202, error: "username Test already taken"}

The problem with that approach is that I'm doing the validation on real time while the user is typing on the text area field:

HTML AngularJS:

<form name="form">
    <h3>e-mail</h3>
    <input class="form-control"
           name="email"
           placeholder="try john.doe@mail.com or bad@domain.com"
           type="email"
           required ng-model="email"
           ng-model-options="{ debounce: 100 }"
           ui-validate="{blacklist: 'notBlackListed($value)'}"
           ui-validate-async="{alreadyExists: 'doesNotExist($modelValue)'}"
    >

    <span ng-show='form.email.$error.blacklist'>This e-mail is black-listed!</span>
    <span ng-show='form.email.$error.alreadyExists'>This e-mail is <b>already taken!</b></span>
    <span ng-show='form.email.$pending'>Verifying e-mail on server...</span>
    <br>is form valid: {{form.$valid}}
</form>

Javascript AngularJS:

$scope.doesNotExist = function (value) {
            Parse.initialize(KEY0, KEY1);
            var deferral = $q.defer();
            var user = new Parse.User();
            user.set("username", "Test");
            user.set("password", "anyapssword");
            user.signUp(null, {
                success: function(user) {
                    // Hooray! Let them use the app now.
                    console.log("success!");
                    // Holly shit now I have to delete the user :( and wait for the full form to be submmited
                    user.destroy({
                    success: function(myObject) {
                        // The object was deleted from the Parse Cloud.
                        console.log("destroy!!!!!!!!!!!");
                    },
                    error: function(myObject, error) {
                        // The delete failed.
                        // error is a Parse.Error with an error code and message.
                        console.log("failed destroy!!!!!!!!!!!");
                    }
                });
                    deferral.resolve(user);
                },
                error: function(user, error) {
                    console.log("Error: " + error.code + " " + error.message);
                    deferral.reject("mierda!");
                }
            });
            return deferral.promise;
        };

So how can I check if a username is taken with parse.com when ACL:Public read/write is disable?

I'm using the AngularUI plugIn to fast validation: https://htmlpreview.github.io/?https://github.com/angular-ui/ui-validate/master/demo/index.html

Thanks!

解决方案

I found my own answer. In case someone is looking here what I did in AngularJS and Parse.com. To save some time I'm using Validate plugIn from AngularUI.

The HTML:

<!DOCTYPE html>
<html lang="en" ng-app="demo">

<head>
    <meta charset="utf-8">
    <title>AngularJS ui-validate</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.1/angular.js"></script>
    <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.css"/>
    <script type="text/javascript" src="http://www.parsecdn.com/js/parse-1.6.14.min.js"></script>

    <!-- ui-validate files -->
    <script src="../dist/validate.js"></script>
</head>

<body class="container">
<script>
    var app = angular.module('demo', ['ui.validate']);
    app.controller('ValidateCtrl', function ($scope, $timeout, $q) {
        $scope.doesNotExist = function (value) {
            Parse.initialize("uO...rPt", "8Bu...1mxFr");    
            var deferral = $q.defer();
            Parse.Cloud.run('mgxIsNameAlreadyTaken', {username: value}, {
                success: function (result) {
                    console.log("httpRequest resultado: " + result);
                    // result is 'Hello world!'
                    deferral.resolve();
                },
                error: function (error) {
                    console.log("si! ya esta tomado!: " + error);
                    deferral.reject();
                }
            });
            return deferral.promise;
            //return true;
        };
    });
</script>
<section id="validate" ng-controller="ValidateCtrl">
    <div class="page-header">
        <h1>Validate</h1>
    </div>
    <h3>What?</h3>
    <div class="row">
        <div class="col-md-6">
            <p>The
                <code>ui-validate</code> and <code>ui-validate-async</code> directives makes it very easy to create
                custom validator expressions.</p>
            <div class="well">
                <form name="form">
                    <h3>e-mail</h3>
                    <input class="form-control"
                           name="email"
                           placeholder="try john.doe@mail.com or bad@domain.com"
                           type="email"
                           required ng-model="email"
                           ng-model-options="{ debounce: 500 }"
                           ui-validate-async="{alreadyExists: 'doesNotExist($modelValue)'}"
                    >
                    <span ng-show='form.email.$error.blacklist'>This e-mail is black-listed!</span>
                    <span ng-show='form.email.$error.alreadyExists'>This e-mail is <b>already taken!</b></span>
                    <span ng-show='form.email.$pending'>Verifying e-mail on server...</span>
                    <span ng-show='form.email.$valid'>This Email is Valid.</span>
                    <br>is form valid: {{form.$valid}}
                    <br>
                </form>
            </div>
        </div>
    </div>
</section>
</body>

</html>

Parse Cloud Code:

Parse.Cloud.define("mgxIsNameAlreadyTaken", function(request, response) {
    Parse.Cloud.useMasterKey();
    var query = new Parse.Query(Parse.User);
    query.equalTo("username", request.params.username);
    query.first({
        success: function(user) {
            if (user) {
                response.error("The username has already been taken.");
            } else {
                response.success("The username "+request.params.username+" is available.");
            }
        },
        error: function(error) {
            console.error("Error en el query de user." + error.code + " : " + error.message);
            response.error("Error in mgxIsNameAlreadyTaken: " + error.code + " : " + error.message);
        }
    });
});

Good luck!

这篇关于当所有用户 ACL:Public 读/写被禁用时,如何检查用户名是否被 parse.com 使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆