Как изменить Permisions в Spring Security ACL? - PullRequest
0 голосов
/ 25 августа 2011

Я хочу расширить права, предоставленные пользователю для объекта.

Я могу создавать ACL через MutableAclService.

MutableAcl acl = this.mutableAclService.createAcl(new ObjectIdentityImpl(entity));            
acl.setOwner(SYSTEM_PRINCIPAL_SID);
acl.insertAce(0, permission, grantToSid, true);
this.mutableAclService.updateAcl(acl);

Но я не знаю, как изменить ACL. Например, если у пользователя есть права на чтение для объекта, я хочу предоставить ему дополнительные права на запись. Или предоставьте другому пользователю те же привилегии.


Моей первой попыткой было дважды вызвать MutableAclService.createAcl, но это не удалось:

org.springframework.security.acls.model.AlreadyExistsException: идентификация объекта 'org.springframework.security.acls.domain.ObjectIdentityImpl [Тип: test.Entity; Идентификатор: 3] 'уже существует

Хорошо, швы должны быть правильными, неправильными. Но как это сделать тогда? Как изменить разрешения acl для объекта, для которого уже определены некоторые разрешения?

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Я думаю, что у вас уже есть ответ, если вы создали MutableAcl, вы можете просто вызвать updateAcl метод MutableAclService. При условии, что контракт этого метода реализован правильно (если вы используете пользовательскую реализацию), он должен:

  • Удалить все ACE из текущего ACL для этого объекта
  • Создайте все новые ACE на основе MutableAcl, который вы передали в updateAcl
  • Обновите все соответствующие поля в ObjectIdentity
  • Обновление ACL-кэша

Единственным недостатком этого является то, что он предполагает стратегию «стирания и загрузки» для ACL, он не предназначен для постепенного добавления ACE и других элементов в существующий ACL. Это означает, что вам, вероятно, следует сначала прочитать список ACL полностью, прежде чем изменять его, чтобы случайно не удалить все записи ACE, которые уже находятся на основном сервере.

Надеюсь, это поможет!

1 голос
/ 29 августа 2011

Я посмотрел на код, и кажется, что существует только одна соответствующая реализация интерфейса ACL: AclImpl.

Этот класс реализует интерфейс MutableAcl и возвращается функциями AclService.

Поэтому я решил привести результаты с Acl на MutableAcl. До сих пор он работал, и я не получил проблему или исключение приведения класса:

MutableAcl existingAcl = (MutableAcl) mutableAclService.readAclById(oid, sids);
...
mutableAclService.updateAcl(existingAcl);
...