gpt4 book ai didi

grails - Spring Security (Acegi) 和用户组(与角色)

转载 作者:行者123 更新时间:2023-12-02 02:15:36 25 4
gpt4 key购买 nike

我们正在开发一个应用程序(使用 Grails Spring Security(以前称为 Acegi)),其中将拥有数千名用户,涵盖 10-15 个谨慎的用户类型。在当前的系统中,每种用户类型都相当于一个“组”,具体的角色和权限与该组绑定(bind)在一起。用户从组中获取所有“角色”。

例如,我们可能有两个用户组:

clown :角色=ride_clown_car、toot_horn、receive_applauseACROBAT:角色 = do_flip、walk_tightrope、receive_applause

我们有三名用户,一名分配给 CLOWN 组,一名分配给 ACROBAT 组,一名分配给这两个组(具有 CLOWN 和 ACROBAT 角色的联合)。

如果我们更改权限,我们会在组级别进行更改。例如,如果我们向 ACROBAT 组添加 swing_on_trapeze 权限,则所有 acrobat 都会自动继承它。

用 Grails 术语来说, Controller 上的权限仍然处于角色级别。因此,使用 @Secured (['toot_horn']) 的操作将允许 CLOWN 组中的用户,但不允许 ACROBAT 组中的用户。 @Secured (['receive_applause']) 将允许 clown 和杂技 Actor 。

考虑到模型的两层性质(用户、角色),我将如何在 Spring Security 中执行此操作?我是否需要实现自己的自定义身份验证来通过组收集基于角色的信息?

谢谢!

最佳答案

您应该使用新的 Spring Security Core plugin因为 Acegi 插件尚未开发并且基本上已被弃用。

但无论哪种方式,这两个插件都只是期望用户类中有类似 getAuthorities() 方法的内容来返回角色实例。在这样的场景中,用户有多个组,只需收集所有组的角色即可:

class User {
...
def getAllRoles() {
Set allRoles = []
groups.each { allRoles.addAll it.roles }
allRoles
}
}

这假设您在用户和组之间有多对多:

static hasMany = [groups: Group]

并且组与角色具有多对多关系:

static hasMany = [roles: Role]

要使用此功能,请将 SecurityConfig.groovy 中的“relationalAuthorities”属性设置为“allRoles”,以便它使用该属性而不是用户和角色之间的多对多:

relationalAuthorities='allRoles'

Spring Security 核心插件不需要配置,因为它已经依赖于应用程序定义的 getAuthorities 方法,因此只需在 User 类中使用类似的内容即可:

Set<Role> getAuthorities() {
Set allRoles = []
groups.each { allRoles.addAll it.roles }
allRoles
}

关于grails - Spring Security (Acegi) 和用户组(与角色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3189768/

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