ACL Spring Security: NotFoundException от JDBCMutableAclService.createAcl - PullRequest
0 голосов
/ 13 мая 2010

Я слишком долго работал над этой задачей, чтобы отказаться от идеи использования Spring Security для ее достижения, но я хотел бы, чтобы сообщество оказало некоторую поддержку, которая поможет уменьшить сожаление, которое я испытываю по поводу выбора Spring Security. , Хватит разглагольствовать, а теперь давайте перейдем к делу.

Я пытаюсь создать ACL с помощью JDBCMutableAclService.createAcl следующим образом:

 public void addPermission(IWFArtifact securedObject, Sid recipient, Permission permission,
   Class clazz) {
  ObjectIdentity oid = new ObjectIdentityImpl(clazz.getCanonicalName(), securedObject.getId());
  this.addPermission(oid, recipient, permission);
 }

 @Override
 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_UNCOMMITTED, readOnly = false)
 public void addPermission(ObjectIdentity oid, Sid recipient, Permission permission) {
  SpringSecurityUtils.assureThreadLocalAuthSet();

  MutableAcl acl;

  try {
   acl = this.mutableAclService.createAcl(oid);
  } catch (AlreadyExistsException e) {
   acl = (MutableAcl) this.mutableAclService.readAclById(oid);
  }
// try {
// acl = (MutableAcl) this.mutableAclService.readAclById(oid);
// } catch (NotFoundException nfe) {
// acl = this.mutableAclService.createAcl(oid);
// }

  acl.insertAce(acl.getEntries().length, permission, recipient, true);
  this.mutableAclService.updateAcl(acl);

 }

Вызов вызывает исключение NotFoundException из строки:

    // Retrieve the ACL via superclass (ensures cache registration, proper retrieval etc)
    Acl acl = readAclById(objectIdentity);

Я полагаю, что это вызвано чем-то связанным с Transactional, и поэтому я протестировал многие атрибуты TransactionDefinition. Я также усомнился в аннотации и попробовал с декларативным определением транзакции, но все же безуспешно.

Одним из важных моментов является то, что я использовал оператор, использованный для вставки oid в базу данных ранее в методе непосредственно в базе данных, и он сработал, а также вызвал уникальное исключение ограничения для меня, когда он пытался вставить его в способ.

Я использую Spring Security 2.0.8 и IceFaces 1.8 (которая не поддерживает Spring 3.0, но определенно поддерживает 2.0.x, особенно когда я продолжаю набирать SpringSecurityUtils.assureThreadLocalAuthSet()). Мой AppServer - Tomcat 6.0, а мой DB Server - MySQL 6.0

Я хочу получить ответ в ближайшее время, потому что мне нужно убрать эту задачу с дороги

1 Ответ

1 голос
/ 13 июля 2010

Ваш код не очень хорошо отформатирован, чтобы понять, в какой строке выдается ошибка. В любом случае NotFoundException должен быть перехвачен и создать новый acl:

try {
    acl = (MutableAcl) mutableAclService.readAclById(oi);
}
catch (NotFoundException e) {
    acl = mutableAclService.createAcl(oi);
}
...