gpt4 book ai didi

java - Spring Security ACL继承: How does it really works?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:18:38 25 4
gpt4 key购买 nike

我正在使用具有域级安全性 (ACL) 的 Spring Security。

我有两个域 Company 和 Book。

class Company {
String name
hasMany = [books: Book]
}

class Book {
String title
belongsTo = [company: Company]
}

我读到 ACL 可以有一个 Parent它从哪里继承权限。

在服务中,我会使用这样的方法来设置新书卡的权限:

@PreAuthorize("hasRole('ROLE_ADMIN') or hasPermission(#book, admin)")
void addPermission(Book book, String username, Permission permission) {
aclUtilService.addPermission(book, username, permission)
}

这工作正常并为新书实例创建了权限。我还有一个更新方法,可以在更新图书之前检查权限。

@PreAuthorize("hasPermission(#book, write) or hasPermission(#book, admin)")
Book update(Book book, Map params = [:]) {
book.properties = params
book.save(flush:true)
return book
}

只要用户拥有这本书的许可,这就可以正常工作。但是,我想将父对象(公司)的权限继承到书中。当用户对公司有权限时,我希望它也对公司的所有书籍都有权限。

我在 AclImp 中看到有一个方法 setParent()。如果您这样做,这将起作用:

AclImpl acl = aclUtilService.readAcl(book)
acl.setParent(aclUtilService.readAcl(book.company))
aclService.updateAcl(acl)

使用上面的代码将在数据库中设置书籍的父级。

如何在 Spring Security ACL 中使用继承?

最佳答案

您可以这样做而不是使用父 ACL:

@PreAuthorize("hasPermission(#book.company, write) or hasPermission(#book.company, admin)")
Book update(Book book, Map params = [:]) {
book.properties = params
book.save(flush:true)
return book
}

如果您希望从父 ACL 继承,请确保子项的 AclObjectIdentityentriesInheriting 设置为 true,例如使用方法createAcl 如下:

void createAcl(Class clazz, Long id, String sid, AclObjectIdentity parent) {
clazz = ProxyUtils.unproxy(clazz)
AclClass aclClass = AclClass.findOrSaveByClassName(clazz.name)
AclSid ownerSid = AclSid.findOrSaveBySidAndPrincipal(sid, true)
AclObjectIdentity oid = findOrCreateObjectIdentity(aclClass, ownerSid, id, parent, true)
}

AclObjectIdentity findOrCreateObjectIdentity(AclClass aclClass, AclSid ownerSid, Long id, AclObjectIdentity parent, boolean entriesInheriting) {
assert aclClass, "aclClass is required"
assert null != id, "id is required"

AclObjectIdentity oid = AclObjectIdentity.findOrCreateByAclClassAndObjectId(aclClass, id)
if (null == oid.id) {
oid.entriesInheriting = entriesInheriting
oid.owner = ownerSid
oid.parent = parent
oid.save(flush: true, failOnError: true)
}
oid
}

如果 ACL 继承 @PreAuthorize("hasPermission(#child, read)") 如果当前用户已读取父级的 ACL,则返回 true

关于java - Spring Security ACL继承: How does it really works?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com