如何在Grails中实现基于权限的访问控制?

时间:2012-04-24 02:36:57

标签: grails groovy permissions role

我想实现基于权限的访问控制as discussed in this post

我对实现不熟悉 - 有没有关于如何从头到尾实现这个的详细示例?

2 个答案:

答案 0 :(得分:0)

你见过Spring security plugin吗? Main docs are here

this post一样,您也可以考虑使用Shiro插件。我发现Spring安全插件更简单,但Shiro确实有一些优点,如帖子所述。

答案 1 :(得分:0)

我刚刚解决了这个问题(大部分时间),所以我在这里发布以供参考。此解决方案适用于Grails 2.2.4和Spring Security 2.0 RC

1)安全域模型 您按照本文中的描述为安全域类建模,因此最终您将拥有这些域: - 许可 - 角色 - RolePermission - 用户 - UserRole

2)查询用户权限 您确保您的User类在getAuthorities()方法中返回权限而不是Roles作为权限:

  /**
   * Gets authorities for the user.
   * 
   * It will return all of the Permissions of the User assigned by the Roles
   * which the User has
   */
  Set<Permission> getAuthorities() {

    Set allPermissions = []
    // Collect all Roles of the User
    UserRole.findAllByUser(this).each { userRole ->
      // Collect all Permissions from the Role  
      Role role = userRole.role
      // Returning the collected permissions
      RolePermission.findAllByRole(role).each { rp ->
        allPermissions.add(rp.permission)
      }
    }
    return allPermissions
  }

3)Spring Security Config

我的Config.groovy中有Spring Security配置(省略了非相关部分):

grails {
  plugin {
    springsecurity {
      ...      
      userLookup {
        userDomainClassName = 'limes.security.User'
      }
      authority {
        nameField = 'name'
        className = 'limes.security.Permission'
      }
      ...
    }
  }
}

一个重要的亮点是authority.nameField,它必须与你的Permission类一致。 name属性在我的模型(和文章)中称为'name'。

当然,您将Permission类设置为authority.className,以使其适合User.getAuthorities()的返回值。

4)在安全表达中使用

上述解决方案并未解决Grails Spring Security插件的限制,您只能使用以“ROLE _”开头的权限名称。

因此,如果你想调用像“PERM_PERMISSION1”这样的权限,那么你必须在任何地方编写EL表达式以进行检查(特别是在控制器@Secured注释和静态URL规则上)。

所以而不是

@Secured(["PERM_PERMISSION1"])

你写

@Secured(["hasRole('PERM_PERMISSION1')"])