Предложение здесь будет глубоко оценено.
Мы используем безопасность объекта домена Spring Security, чтобы заблокировать доступ к определенным объектам в нашем приложении Grails. У нас также есть расширенные разрешения. Мы используем обычную аннотацию @PreAuthorize для управления доступом к объектам домена в зависимости от привилегий, назначенных конкретному пользователю.
В этой архитектуре я хочу, чтобы один пользователь мог пригласить второго пользователя присоединиться к группе. Для этого второй пользователь получает от первого пользователя приглашение присоединиться к группе с определенными привилегиями. Второй пользователь может принять или отклонить приглашение.
Учитывая, что объект домена принадлежит первому пользователю, а не второму пользователю, как я могу предоставить второму пользователю доступ к объекту домена с предлагаемыми привилегиями?
Я попытался взломать решение, используя @PreAuthorize("permitAll") в сервисном методе, просто чтобы посмотреть, сработает ли это. Хотя я и не спрашивал «secure» как предоставление объекту привилегии устанавливать привилегии для объекта домена, это, по крайней мере, заставило бы меня двигаться дальше. Но без радости, я продолжаю получать ошибки «accessDenied for class», предположительно потому, что текущий пользователь является вторым пользователем, а не владельцем объекта домена.
Нужно ли мне работать с предложением SpEL здесь? К сожалению, я едва понимаю, как работает распознаватель bean-компонентов.
Изменить: даже когда я проверяю, действительно ли приглашение при вызове, Spring ACL выдает исключение при попытке вставки первого ACE для нового пользователя. Исключение возникает в void setPermissions (идентификатор ObjectIdentity, получатель, разрешения на коллекцию) при вызове insertAce:
void setPermissions (идентификатор ObjectIdentity, получатель, разрешения на сбор) { Sid sid = createSid (получатель)
MutableAcl acl
try {
acl = aclService.readAclById(oid)
}
catch (NotFoundException e) {
acl = aclService.createAcl(oid)
}
int deleted = 0
acl.entries.eachWithIndex { AccessControlEntry ace, int i ->
if (ace.sid == sid) {
acl.deleteAce(i-deleted)
deleted++
}
}
permissions.each {
acl.insertAce(acl.entries.size(), it, sid, true)
}
aclService.updateAcl acl
}
Я предполагаю, что в доступе отказано, потому что текущий пользователь (которого не существовало на момент выдачи приглашения) не имеет права устанавливать разрешения для объекта, принадлежащего другому пользователю.