ここでの提案をいただければ幸いです。
Spring Security ドメイン オブジェクト セキュリティを使用して、Grails アプリケーション内の特定のオブジェクトへのアクセスをロックダウンします。権限も拡張されています。通常の @PreAuthorize アノテーションを使用して、特定のユーザーに割り当てられた権限に応じてドメイン オブジェクトへのアクセスを制御します。
このアーキテクチャでは、1 人のユーザーが 2 番目のユーザーをグループに招待できるようにしたいと考えています。これを行うために、2 番目のユーザーは、特定の権限を持つグループに参加するための招待を最初のユーザーから受け取ります。2 番目のユーザーは、招待を受け入れるか拒否するかを選択できます。
ドメイン オブジェクトが 2 番目のユーザーではなく最初のユーザーに属している場合、2 番目のユーザーに提供された権限でドメイン オブジェクトへのアクセスを許可するにはどうすればよいでしょうか?
サービスメソッドで @PreAuthorize("permitAll") を使用してソリューションをハックして、それが機能するかどうかを確認しようとしました。ドメイン オブジェクトに特権を設定する特権をオブジェクトに付与するようにセキュアに要求するわけではありませんが、少なくともそれでうまくいくでしょう。おそらく、現在のユーザーが2番目のユーザーであり、ドメインオブジェクトの所有者ではないため、「クラスのaccessDenied」エラーが引き続き発生します。
ここで SpEL の提案に取り組む必要がありますか? 残念ながら、Bean リゾルバーがどのように機能するかはほとんどわかりません。
編集:呼び出し時に招待が有効であることを確認しても、Spring ACL は、新しいユーザーの最初の ACE を挿入しようとすると例外をスローします。insertAce 呼び出しの void setPermissions(ObjectIdentity oid, recipient, Collection permissions) で例外が発生します。
void setPermissions(ObjectIdentity oid, recipient, Collection permissions) { Sid sid = createSid(recipient)
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
}
現在のユーザー (招待が発行された時点では存在していなかった) には、別のユーザーが所有するオブジェクトにアクセス許可を設定する権限がないため、アクセスが拒否されたと思います。