2016-12-25 6 views
-1

Я пытаюсь создать администратора по умолчанию для загрузки по умолчанию для моего приложения loopback node.js с облачной базой данных. Но каждый раз, когда я запускаю приложение, логин завершается с ошибкой для администратора по умолчанию. Что-то не так с кодом, из-за которого данные не хранятся в облачной базе данных или что-то еще?Ошибка входа в систему и авторизация с REST в loopback

Также авторизованные задачи REST не будут работать, если я вручную создаю Администратор, вместо этого выдается ошибка авторизации 401.

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

{ 
     "name": "user", 
     "base": "User", 
     "idInjection": true, 
     "options": { 
     "validateUpsert": true 
     }, 
     "properties": { 
     "name": { 
      "type": "string", 
      "required": true 
     }, 
     "image": { 
      "type": "string", 
      "required": true 
     }, 
     "country": { 
      "type": "string", 
      "required": true 
     }, 
     "phone": { 
      "type": "string", 
      "required": true 
     } 
     }, 
     "validations": [], 
     "relations": { 
     "comments": { 
      "type": "hasMany", 
      "model": "comments", 
      "foreignKey": "userId" 
     }, 
     "watchLists": { 
      "type": "hasMany", 
      "model": "watchList", 
      "foreignKey": "userId" 
     } 
     }, 
     "acls": [ 
     { 
      "accessType": "*", 
      "principalType": "ROLE", 
      "principalId": "$everyone", 
      "permission": "DENY" 
     }, 
     { 
      "accessType": "READ", 
      "principalType": "ROLE", 
      "principalId": "admin", 
      "permission": "ALLOW" 
     }, 
     { 
      "accessType": "READ", 
      "principalType": "ROLE", 
      "principalId": "$owner", 
      "permission": "ALLOW" 
     }, 
     { 
      "accessType": "EXECUTE", 
      "principalType": "ROLE", 
      "principalId": "admin", 
      "permission": "ALLOW", 
      "property": "create" 
     }, 
     { 
      "accessType": "WRITE", 
      "principalType": "ROLE", 
      "principalId": "admin", 
      "permission": "ALLOW" 
     } 
     ], 
     "methods": {} 
    } 

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

module.exports = function (app) { 
var cloudantDB = app.dataSources.cloudant; 
cloudantDB.automigrate('user', function (err) { 
if (err) throw (err); 
var user = app.models.user; 

user.find({ where: { username: 'Admin' }, limit: 1 }, function (err, users) { 

    if (!users) { 
    user.create([ 
     { username: 'Admin', email: '[email protected]', password: 'abcdef' } 
    ], function (err, users) { 
     if (err) return debug(err); 

     var Role = app.models.Role; 
     var RoleMapping = app.models.RoleMapping; 

     Role.destroyAll(); 
     RoleMapping.destroyAll(); 

     //create the admin role 
     Role.find({ 
     name: 'admin' 
     }, function (err, results) { 
     if (err) return debug(err); 

     //make Admin an admin 
     if (results.length < 1) { 
     //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); 
      }); 
     }); 
     } 
    }); 
    }) 
} 
else { 

} 

}); 
}); 
}; 

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

{ 
    "db": { 
    "name": "db", 
    "connector": "memory" 
}, 
"cloudant": { 
    "host": "de945f4f-c2d2-41d8-ab3c-925e3e1f8e15-bluemix.cloudant.com", 
    "port": 443, 
    "database": "show-guide-database", 
    "username": "de945f4f-c2d2-41d8-ab3c-925e3e1f8e15-bluemix", 
    "password": "55862b46942ecd959092648262b18c3ac6f7439b7025e8bdd5a4e303779f1641", 
    "name": "cloudant", 
    "connector": "cloudant" 
}, 
"images": { 
    "name": "images", 
    "connector": "loopback-component-storage", 
    "provider": "filesystem", 
    "root": "./client/" 
} 
} 

сервер/файл модели-config.json выглядит следующим образом:

{ 
    "_meta": { 
"sources": [ 
    "loopback/common/models", 
    "loopback/server/models", 
    "../common/models", 
    "./models" 
], 
"mixins": [ 
    "loopback/common/mixins", 
    "loopback/server/mixins", 
    "../common/mixins", 
    "./mixins" 
] 
}, 
"User": { 
    "dataSource": "db" 
}, 
"AccessToken": { 
    "dataSource": "db", 
    "public": false 
}, 
"ACL": { 
    "dataSource": "cloudant", 
    "public": false 
}, 
"RoleMapping": { 
    "dataSource": "cloudant", 
    "public": false 
}, 
"Role": { 
    "dataSource": "cloudant", 
    "public": false 
}, 
"shows": { 
    "dataSource": "cloudant", 
    "public": true, 
    "$promise": {}, 
    "$resolved": true 
}, 
"comments": { 
    "dataSource": "cloudant", 
    "public": true 
}, 
"user": { 
    "dataSource": "cloudant", 
    "public": true, 
    "$promise": {}, 
    "$resolved": true 
}, 
"watchList": { 
    "dataSource": "cloudant", 
    "public": true 
}, 
"series": { 
    "dataSource": "cloudant", 
    "public": true 
}, 
"container": { 
    "dataSource": "images", 
    "public": true 
} 
} 
+0

Вы забыли про методы вызова асинхронного вызова. 'destroyAll',' find' являются асинхронными, и вы называете метод синхронизации. Синхронизировать все из них с помощью модуля 'async', чтобы сохранить заказы между вызовами –

+0

, не могли бы вы рассказать? –

ответ

0

Вам нужно всего лишь проверить наличие учетной записи администратора. Не нужно ничего разрушать.

//server/boot/admin.js 

'use strict'; 

var async = require('async'); 

module.exports = function(app, cb) { 
    /* 
    * Adding necessary admin `User`s to database. 
    */ 

    var User = app.models.User; 
    var Role = app.models.Role; 
    var RoleMapping = app.models.RoleMapping; 

    var admin = { 
    username: 'admin', 
    email: '[email protected]', 
    password: '123456' 
    }; 

    User.count({email: admin.email}, function(err, count) { 
    if (err) return cb(err); 
    if (count > 0) return cb(null); 
    User.create(admin, adminHandler); 
    }); 

    var adminHandler = function(err, user) { 
    if (err) return cb(err); 

    async.waterfall([ 
     function(callback) { 
     Role.findOne({where: {name: 'ADMIN'}}, function(err, role) { 
      if (err) return callback(err); 
      if (role) return callback(null, role); 
      Role.create({name: 'ADMIN'}, callback); 
     }); 
     }, 
     function(role, callback) { 
     role.principals.create({ 
      principalType: RoleMapping.User, 
      principalId: user.id 
     }, callback); 
     } 
    ], function(err, result) { 
     if (err) return cb(err); 
     cb(null); 
    }); 
    }; 
}; 
+0

сделано, но все еще не работает. Я не знаю, но файл сценария.js внутри загрузочной папки не запускается при запуске приложения. –