2015-07-08 2 views
1

Пожалуйста, кто-нибудь может мне помочь?Пользователь не в доступу или редактировать себя в LoopBackJS

Я создал пользователя-администратора и простого пользователя, администратор может делать все, что угодно, но я пытаюсь отредактировать простого пользователя, используя свой собственный аутентифицированный токен, и я каждый раз несанкционирован, даже когда получаю сообщение , введите или удалите, здесь мой user.json:

{ 
"name": "User", 
"properties": { 
"realm": { 
"type": "string" 
}, 
"username": { 
"type": "string" 
}, 
"realName": { 
"type": "string", 
"required": true 
}, 
"timezone": { 
"type": "string", 
"required": false 
}, 
"language": { 
"type": "string", 
"required": false 
}, 
"password": { 
"type": "string", 
"required": true 
}, 
"credentials": { 
"type": "object", 
"deprecated": true 
}, 
"challenges": { 
"type": "object", 
"deprecated": true 
}, 
"email": { 
"type": "string", 
"required": true 
}, 
"ownerId": { 
"type": "number", 
"required": true 
}, 
"emailVerified": "boolean", 
"verificationToken": "string", 
"status": "boolean", 
"created": "date", 
"lastUpdated": "date" 
}, 
"hidden": ["password"], 
"acls": [ 
{ 
"principalType": "ROLE", 
"principalId": "$everyone", 
"permission": "DENY" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$everyone", 
"permission": "ALLOW", 
"property": "create" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$owner", 
"permission": "ALLOW", 
"property": "deleteById" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$everyone", 
"permission": "ALLOW", 
"property": "login" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$everyone", 
"permission": "ALLOW", 
"property": "logout" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$owner", 
"permission": "ALLOW", 
"property": "findById" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$owner", 
"permission": "ALLOW", 
"property": "upsert" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$owner", 
"permission": "ALLOW", 
"property": "updateAttributes" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$everyone", 
"permission": "ALLOW", 
"property": "activation" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$everyone", 
"permission": "ALLOW", 
"property": "confirm" 
}, 
{ 
"principalType": "ROLE", 
"principalId": "$everyone", 
"permission": "ALLOW", 
"property": "resetPassword", 
"accessType": "EXECUTE" 
} 
], 
"relations": { 
"accessTokens": { 
"type": "hasMany", 
"model": "AccessToken", 
"foreignKey": "userId", 
"options": { 
"disableInclude": true 
} 
} 
} 
} 

ответ

0

Вы намерены переопределить базовую модель пользователя? Если это так, вы должны называть его чем-то вроде MyUser и устанавливать базу как «Пользователь». В server/model-config.json установите «public» в false для «User» и true для «MyUser».

+0

Hi Raymond, на самом деле не хочу создавать другую модель пользователя, я расширяю встроенную модель. Мне просто нужно разрешить пользователю редактировать свой собственный профиль, но владелец primaryId: $ не работает для объекта User, если только мне не нужно делать какую-то другую конфигурацию, чтобы это разрешить. –

0

Хорошо, давайте объясним решение.

С помощью команды отладки линии безопасности я мог видеть, как Loopback решительность разрешения:

# DEBUG=loopback:security:role node . 
loopback:security:role isInRole(): $everyone +0ms 
    loopback:security:role Custom resolver found for role $everyone +1ms 
    loopback:security:role isInRole(): $owner +0ms 
    loopback:security:role Custom resolver found for role $owner +0ms 
    loopback:security:role isOwner(): User 11 userId: 11 +1ms 
    loopback:security:role Model found: {"realm":null,"username":"...","id":11} +4ms 
    loopback:security:role No matching belongsTo relation found for model "11" and user: 11 +1ms 

Используя эти данные, я создал поле с именем «идентификатор пользователя» в таблице пользователей и указал директиву belongsTo в этой области внутри его собственной файл (user.json).

"user": { 
     "type": "belongsTo", 
     "model": "User", 
     "foreignKey": "userId" 
    } 

Теперь пользователь 11 может редактировать свой собственный профиль, но не может видеть или изменять какой-либо другой пользовательский регистр.

Это не красивое решение, на самом деле loopback должен иметь эту собственную директиву внутри логики ACL, но она работает.

С уважением