私はこのタスクにあまりにも長い間取り組んできたので、Spring Security を使用してそれを達成するという考えを放棄することはできませんでしたが、Spring Security を選択したことに対する後悔を減らすのに役立つ何らかのサポートをコミュニティが提供してくれることを願っています。暴言はもう十分です。では、本題に入りましょう。
次のように JDBCMutableAclService.createAcl を使用して ACL を作成しようとしています。
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 属性をテストしました。私も注釈を疑い、宣言的なトランザクション定義を試しましたが、まだ運がありません。
重要な点の 1 つは、メソッドの前にデータベースに oid を挿入するために使用したステートメントをデータベースに直接使用したところ、それが機能し、メソッドに挿入しようとしたときに一意の制約例外がスローされたことです。
私はSpring Security 2.0.8とIceFaces 1.8を使用しています(これはSpring 3.0をサポートしていませんが、特にcalingを続けると、2.0.xを明確にサポートしSpringSecurityUtils.assureThreadLocalAuthSet())
ます。私のAppServerはTomcat 6.0で、DBサーバーはMySQL 6.0です
このタスクを途中で終わらせる必要があるため、すぐに返信を返したい