2016-09-16 2 views
0

У меня есть приложение кольцевой проверки с MongoDB, как показано ниже:Loopback ошибка: Требуется авторизация

, когда я войти в систему как администратор, я не могу использовать метод пост на кухне. и я получаю ошибку авторизации. , что становится возможным только тогда, когда я меняю роль блюд, чтобы ПОЗВОЛЯТЬ всех.

Как я могу получить желаемый результат, сохраняя всех в DENY и только ПОЗВОЛЯЮ некоторых пользователей к определенным операциям? спасибо. Вот мой код ..

приложение/сервер/модель-config.json:

{ 
    "_meta": { 
    "sources": [ 
     "loopback/common/models", 
     "loopback/server/models", 
     "../common/models", 
     "./models" 
    ], 
    "mixins": [ 
     "loopback/common/mixins", 
     "loopback/server/mixins", 
     "../node_modules/loopback-ds-timestamp-mixin", 
     "../common/mixins", 
     "./mixins" 
    ] 
    }, 
    "User": { 
    "dataSource": "db" 
    }, 
    "AccessToken": { 
    "dataSource": "db", 
    "public": false 
    }, 
    "ACL": { 
    "dataSource": "MongoDB", 
    "public": false 
    }, 
    "RoleMapping": { 
    "dataSource": "MongoDB", 
    "public": false 
    }, 
    "Role": { 
    "dataSource": "MongoDB", 
    "public": false 
    }, 
    "dishes": { 
    "dataSource": "MongoDB", 
    "public": true 
    }, 
    "Customer": { 
    "dataSource": "MongoDB", 
    "public": true 
    }, 
    "Comments": { 
    "dataSource": "MongoDB", 
    "public": true 
    } 
} 

приложение/общий/modles/dishes.json:

{ 
    "name": "dishes", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "name": { 
     "type": "string", 
     "required": true 
    }, 
    "description": { 
     "type": "string", 
     "required": true 
    }, 
    "category": { 
     "type": "string", 
     "required": true 
    }, 
    "image": { 
     "type": "string", 
     "required": true 
    }, 
    "label": { 
     "type": "string", 
     "required": true, 
     "default": "''" 
    }, 
    "price": { 
     "type": "string", 
     "required": true, 
     "default": "0" 
    } 
    }, 
    "mixins": { 
    "TimeStamp": true 
    }, 
    "validations": [], 
    "relations": { 
    "comments": { 
     "type": "hasMany", 
     "model": "Comments", 
     "foreignKey": "" 
    }, 
    "customers": { 
     "type": "hasMany", 
     "model": "Customer", 
     "foreignKey": "" 
    } 
    }, 
    "acls": [ 
    { 
     "accessType": "*", 
     "principalType": "ROLE", 
     "principalId": "$everyone", 
     "permission": "DENY" 
    }, 
    { 
     "accessType": "READ", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW" 
    }, 
    { 
     "accessType": "EXECUTE", 
     "principalType": "ROLE", 
     "principalId": "admin", 
     "permission": "ALLOW", 
     "property": "create" 
    }, 
    { 
     "accessType": "WRITE", 
     "principalType": "ROLE", 
     "principalId": "admin", 
     "permission": "ALLOW" 
    } 
    ], 
    "methods": {} 
} 

приложение/общий/modles/comments.json:

{ 
    "name": "Comments", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "Rating": { 
     "type": "number", 
     "required": true, 
     "default": 5 
    }, 
    "comment": { 
     "type": "string", 
     "required": true 
    } 
    }, 
    "mixins": { 
    "TimeStamp": true 
    }, 
    "validations": [], 
    "relations": { 
    "dishes": { 
     "type": "belongsTo", 
     "model": "dishes", 
     "foreignKey": "" 
    }, 
    "customer": { 
     "type": "belongsTo", 
     "model": "Customer", 
     "foreignKey": "customerId" 
    } 
    }, 
    "acls": [ 
    { 
     "accessType": "*", 
     "principalType": "ROLE", 
     "principalId": "$everyone", 
     "permission": "DENY" 
    }, 
    { 
     "accessType": "READ", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW" 
    }, 
    { 
     "accessType": "EXECUTE", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW", 
     "property": "create" 
    }, 
    { 
     "accessType": "WRITE", 
     "principalType": "ROLE", 
     "principalId": "$owner", 
     "permission": "ALLOW" 
    } 
    ], 
    "methods": {} 
} 

приложение/общие/modles/customer.json:

{ 
    "name": "Customer", 
    "base": "User", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": {}, 
    "validations": [], 
    "relations": { 
    "comments": { 
     "type": "hasMany", 
     "model": "Comments", 
     "foreignKey": "customerId" 
    } 
    }, 
    "acls": [ 
    { 
     "accessType": "*", 
     "principalType": "ROLE", 
     "principalId": "$everyone", 
     "permission": "DENY" 
    } 
    ], 
    "methods": {} 
} 

и приложение/сервер/загрузки/script.js:

module.exports = function(app) { 
var MongoDB = app.dataSources.MongoDB; 

MongoDB.automigrate('Customer', function(err) { 
    if (err) throw (err); 
    var Customer = app.models.Customer; 

    Customer.create([ 
    {username: 'Admin', email: '[email protected]', password: 'abcdef'}, 
    {username: 'muppala', email: '[email protected]', password: 'abcdef'} 
    ], function(err, users) { 
     if (err) throw (err); 
     var Role = app.models.Role; 
     var RoleMapping = app.models.RoleMapping; 

     Role.find({ name: 'admin' }, function(err, results) { 
      if (err) { throw err; } 

      if (results.length < 1) { 
       // now we know the DB doesn't have it already, so do the Role creation... 
       //create the admin role 
       Role.create({ 
        name: 'admin' 
       }, function(err, role) { 
        if (err) throw (err); 
        //make admin 
        role.principals.create({ 
        principalType: RoleMapping.USER, 
        principalId: users[0].id 
        }, function(err, principal) { 
        if (err) throw (err); 
        }); 
       }); 
      } 
     }); 
    }); 
}); 

}; 

ответ

0

Видя ваше last question я себе представить, что случилось.

Как-то коллекция Role была создана, но не отображена на User.

Я предлагаю вам изменить:

Role.find({ name: 'admin' }, function(err, results) { 
      if (err) { throw err; } 

      if (results.length < 1) { 
       // now we know the DB doesn't have it already, so do the Role creation... 
       //create the admin role 
       Role.create({ 
        name: 'admin' 
       }, function(err, role) { 
        if (err) throw (err); 
        //make admin 
        role.principals.create({ 
        principalType: RoleMapping.USER, 
        principalId: users[0].id 
        }, function(err, principal) { 
        if (err) throw (err); 
        }); 
       }); 
      } 
     }); 

By:

Role.create({ 
     name: 'admin' 
    }, function(err, role) { 
     if (err) throw (err); 
     //make admin 
     role.principals.create({ 
     principalType: RoleMapping.USER, 
     principalId: users[0].id 
     }, function(err, principal) { 
     if (err) throw (err); 
     }); 
    }); 

Отбросьте коллекцию Роль: db.Role.drop() и снова выполнить Loopback.

Примечание: Я делал то же самое и работал для меня.

0

У меня также такая же проблема, как и в том же задании. Ответ г-на Кика работает для меня. Во-первых, из CMD, типа

>mongo 
>use conFusion (Note: conFusion is the name of database of this assignment) 
>show collections (Note: to see all collections in database collections) 
>db.Role.drop()  

А затем запустить обратную петлю с узлом. снова

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