2015-03-21 3 views
4

Запись Parse Cloud Function (которая использует Parse Javascript SDK), и у меня возникли проблемы с проверкой, имеет ли текущий пользователь роль «Admin». Я просматриваю веб-представление класса Role и роль с именем «Admin» существует, если я нажимаю «View Relations» для пользователей, он показывает текущего пользователя. Я сомневаюсь, что это имеет значение, но «Admin» - единственная роль, и текущий пользователь является единственным пользователем с ролью. Наконец, роль «Администратор» имеет ACL общедоступного чтения, поэтому это также не должно вызывать никаких проблем.Проверьте, имеет ли пользователь роль - Parse Cloud Code

код выглядит следующим образом:

... 
var queryRole = new Parse.Query(Parse.Role); 
queryRole.equalTo('name', 'Admin'); 
queryRole.equalTo("users", Parse.User.current()); 
queryRole.first({ 
    success: function(result) { // Role Object 
     var role = result; 
     role ? authorized = true : console.log('Shiet, user not Admin'); 
    }, 
    error: function(error) { 
     console.log("Bruh, queryRole error"); 
    } 
}) 
console.log('After test: Auth = ' + authorized); 
if (!authorized) { 
    response.error("You ain't no admin, measly user"); 
    return;  
} 
... 

Это приводит к следующим в журнале:

Перед испытанием: Auth = ложь

После теста: Auth = ложь

+1

Вы должны использовать обещание. Вы читаете значение до завершения запроса. –

+0

Да, я понял, что из кода Брайана, над которым работал, я предложил изменить, которое включало больше, чем «дать этот снимок», но получило «отказ». –

ответ

8

Дайте этот снимок:

var authorized = false; 
console.log('Before test: Auth = ' + authorized); 

var queryRole = new Parse.Query(Parse.Role); 
queryRole.equalTo('name', 'Admin'); 
queryRole.first({ 
    success: function(result) { // Role Object 
     console.log("Okay, that's a start... in success 1 with results: " + result); 

     var role = result; 
     var adminRelation = new Parse.Relation(role, 'users'); 
     var queryAdmins = adminRelation.query(); 

     queryAdmins.equalTo('objectId', Parse.User.current().id); 
     queryAdmins.first({ 
      success: function(result) { // User Object 
       var user = result; 
       user ? authorized = true : console.log('Shiet, user not Admin'); 
      } 
     }); 
    }, 
    error: function(error) { 
     console.log("Bruh, can't find the Admin role"); 
    } 
}).then(function() { 
    console.log('After test: Auth = ' + authorized); 
}); 
+1

.. Мне очень нравится «Shiet, пользователь не админ» :) и, конечно же, мне очень помог! –

4

я получил более простое решение, дать этому попытку:

var adminRoleQuery = new Parse.Query(Parse.Role); 
adminRoleQuery.equalTo('name', 'admin'); 
adminRoleQuery.equalTo('users', req.user); 

return adminRoleQuery.first().then(function(adminRole) { 
    if (!adminRole) { 
    throw new Error('Not an admin'); 
    } 
}); 
+1

Я могу проверить, работает ли этот синтаксис: 'equalTo ('relation', value)' и 'notEqualTo ('relation', value)' действительно соответствует элементам по принципу равенства. Это должен быть правильный ответ. – fatuhoku

+0

Что делать, если вы устанавливаете ACL для роли с доступом для чтения для пользователя, тогда запрос должен получить эту роль, если у пользователя есть разрешение на это или из другой роли с разрешением на чтение этой роли? –

+0

Я не могу подтвердить, потому что я не тестировал. Но да, это должно сработать! – gfpacheco

Смежные вопросы