2017-09-13 50 views
1

我在迴環中遇到了acl問題。 我能夠正確地在數據庫中創建Role和RoleMapping集合。 問題是,當管理員嘗試創建一個新的產品,它說未經授權。有人能指導我做錯了什麼,或者指導我做正確的做法。如何在環回中正確設置ACL

project.json

{ 
    "name": "product", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": {}, 
    "validations": [], 
    "relations": { 

    "admin": { 
     "type": "belongsTo", 
     "model": "admin", 
     "foreignKey": "" 
    } 
    }, 
    "acls": [ 
    { 
     "accessType": "*", 
     "principalType": "ROLE", 
     "principalId": "$everyone", 
     "permission": "DENY" 
    }, 
    { 
     "accessType": "READ", 
     "principalType": "ROLE", 
     "principalId": "$authenticated", 
     "permission": "ALLOW" 
    }, 
    { 
     "accessType": "*", 
     "principalType": "ROLE", 
     "principalId": "admin", 
     "permission": "ALLOW", 
     "property": "create" 
    } 
    ], 
    "methods": {} 
} 

admin.json

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

admin.js

'use strict'; 

module.exports = function(Admin) { 

Admin.afterRemote('create', function(context, user, next) { 

     Admin.app.models.Role.upsertWithWhere({ 
      name: 'admin' 
      },{name:'admin'}, function(err, role) { 
      if (err) throw err; 

      console.log('Created role:', role); 

      role.principals.create({ 
       principalType: Admin.app.models.RoleMapping.ROLE, 
       principalId: user.id 
      }, function(err, principal) { 
       if (err) throw err; 

       console.log('Created principal:', principal); 

      }); 
      }); 


      next(); 
    }); 


}; 

回答

0

環迴文檔ACL的管理是很清楚,從http://loopback.io/doc/en/lb3/Defining-and-using-roles.html#static-roles

Role.create({ 
 
    name: 'admin' 
 
}, function(err, role) { 
 
    if (err) cb(err); 
 

 
    role.principals.create({ 
 
    principalType: RoleMapping.USER, 
 
    principalId: <USER_ID> 
 
    }, function(err, principal) { 
 
    cb(err); 
 
    }); 
 
});

的靜態角色admin的示例採用內存作爲主存儲和需要每次開機要執行的代碼。如果您使用的是持久性數據庫,則只需要創建一次管理角色,然後就可以將admin角色分配給用戶。

project.json ACL已經是很好,這些都是你需要採取的步驟:

  1. 刪除admin.jsonadmin.js因爲你並不需要一個實體來處理資源的授權。
  2. 創建一個腳本,創建角色admin,如果它還不存在。
  3. 創建一個腳本,它將用戶標識作爲參數並將角色admin賦予給定的用戶。