【问题标题】:Spring Security (Acegi) and user Groups (vs. Roles)Spring Security (Acegi) 和用户组(与角色相比)
【发布时间】:2011-03-12 12:17:05
【问题描述】:

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

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

小丑:角色 = Ride_clown_car、toot_horn、receive_applause ACROBAT:角色 = do_flip、walk_tightrope、receive_applause

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

如果我们更改权限,我们会在组级别进行。例如,如果我们给 ACROBAT 组添加一个 swing_on_trapeze 权限,那么所有的杂技演员都会自动继承它。

在 Grails 术语中,控制器上的权限仍处于角色级别。因此,@Secured (['toot_horn']) 的操作将允许 CLOWN 组中的用户,但不允许 ACROBAT 组中的用户。 @Secured (['receive_applause']) 将允许 CLOWNS 和 ACROBATS。

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

谢谢!

【问题讨论】:

  • 我正在实现与您的非常相似的东西。您如何在您的情况下设置“grails.plugin.springsecurity.userLookup.authorityJoinClassName”?在两级系统中,这只能指向未定义实际角色/权限的第一级(用户组)。

标签: grails spring-security


【解决方案1】:

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

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

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

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

static hasMany = [groups: Group]

并且 Group 有一个多对多的 with Role:

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
}

【讨论】:

  • 啊-我没有想到 Spring Security 不直接访问角色-仅通过用户上的聚合器方法。感谢您这么快发布这个简单、优雅的解决方案!欣赏它。感谢您为插件本身所做的所有工作!
  • @Burt:我正在实现与 ecodan 非常相似的东西。在这种情况下如何更改“grails.plugin.springsecurity.userLookup.authorityJoinClassName”?
猜你喜欢
  • 2012-06-08
  • 2011-07-21
  • 2022-08-09
  • 2013-01-13
  • 2020-04-11
  • 1970-01-01
  • 2011-04-12
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多