2016-01-16 14 views
0

如何在使用ACL時檢查用戶名是否與parse.com Javascript SDK一起使用:公共讀/寫在用戶類內的所有用戶中被禁用?當所有用戶ACL:公用讀/寫禁用時,如何檢查用戶名是否與parse.com一起使用?

說明: 出於安全考慮我的所有用戶類/表用戶有私人 ACL(訪問控制列表),或換言之,針對公共讀/寫ACL是禁用,這意味着經過認證的用戶請閱讀只有自己的信息。

正如你能想象的任何查詢,用戶將獲得空非登錄用戶所以沒有辦法來檢查,如果用戶是通過在用戶類別使用查詢已經採取

我設法解決這個由singUp一個新的用戶,然後解析會返回一個400錯誤一些好的信息:

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

與方法的問題是,我做實時驗證當用戶在輸入文本領域:

HTML AngularJS:

<form name="form"> 
    <h3>e-mail</h3> 
    <input class="form-control" 
      name="email" 
      placeholder="try [email protected] or [email protected]" 
      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; 
     }; 

所以,我怎麼可以檢查用戶名時採取parse.com當ACL:公共讀/寫是禁用?

我使用AngularUI插件快速驗證:https://htmlpreview.github.io/?https://github.com/angular-ui/ui-validate/master/demo/index.html

謝謝!

回答

0

您可以創建一個雲代碼函數,使您能夠檢查是否使用用戶名 - 您可以使用masterKey()查找用戶名,以便您從用戶表讀取數據。

讓我知道你是否需要更多信息。

+0

這個函數將會如何?你能指導我一點嗎? – lito

0

我找到了我自己的答案。如果有人在這裏看我在AngularJS和Parse.com做了什麼。爲了節省一些時間,我使用了AngularUI的Validate plugIn。

的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 [email protected] or [email protected]" 
          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.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); 
     } 
    }); 
}); 

祝你好運!

相關問題