使用Spring Security插件的现有域类

Dón*_*nal 6 grails spring spring-security

我正在尝试将Stripes Web应用程序转换为Grails.Stripes应用程序使用Spring Security,但我希望Grails应用程序使用Spring Security Grails插件.

该应用程序已经有UserRole我需要重用,即我不能使用的Grails的领域类(Java)的类S2-快速启动脚本生成.

Spring Security插件文档描述了如何使用现有的User域类.步骤似乎是:

  1. 定义UserDetails从现有User域类读取的实现
  2. 定义一个UserDetailsService返回(1)实例的自定义实现
  3. 将(2)的实例注册为名为的Spring bean userDetailsService.

但是,文档不提供有关如何使用现有Role类的任何信息以及表示User和之间的多对多关系的类Role.

利用现有的其他措施是必要的Role,User以及UserRole类与Grails的春季安全插件?如果我不想生成任何域类,是否有任何理由让我运行s2-quickstart脚本?

Burt答案的后续问题

最后,你需要的是一个新的 GrailsUser

想必GrailsUser这里是指自定义UserDetails实现?在我的情况下,我可能只是直接实现接口.这样的事情看起来合情合理吗?

class UserAdapter implements UserDetails {
  private String password  
  private Collection<GrantedAuthority> springRoles

  UserAdapter(User user) {
    this.password = user.password

    Collection<Role> roles = // load legacy Role objects
    this.springRoles = roles.collect { new GrantedAuthorityImpl(it.authority) }
  }      

  // If using password hashing, presumably this is the hashed password?
  String getPassword() {
    password  
  }

  ///////// other UserDetails methods omitted

  Collection<GrantedAuthority> getAuthorities() {
    springRoles
  }
}
Run Code Online (Sandbox Code Playgroud)

我没有存储整个User对象,UserAdapter因为您警告有关在HTTP会话中存储潜在的大对象.

你需要的是.....和一个GrantedAuthority实例列表(如果它是一个GrailsUser,则为id)

如果我使用我自己的UserDetails实现,那么大概我可以忽略这个关于提供的评论id

最后,如果我按照上面概述的方法,我应该设置这些属性,Config.groovy我是否需要运行s2-quickstart脚本(或任何其他)?

Bur*_*ith 4

请记住,Spring Security 并不关心数据来自哪里,它只需要UserDetails在使用 DAO 身份验证提供程序进行身份验证时需要一个实例,并且它可以来自任何地方。使用域类和数据库表很方便,但这只是一种方法。做对您的数据有效的事情。最后,您需要的是一个新的GrailsUser(或其他一些 impl)实例,其中包含 和usernamepassword、3 个布尔值集和一个GrantedAuthority实例列表(以及 ,id如果它是一个GrailsUser)。

当您拥有旧用户和角色数据时,最简单的做法是创建自定义UserDetailsService. 使用 GORM、原始 SQL 查询,无论您需要什么来获取所需的数据。

另一种选择是自己编写,AuthenticationProvider就像 Glen 在这里所做的那样:http ://blogs.bytecode.com.au/glen/2010/01/15/hacking-custom-authentication-providers-with-grails-spring-security.html -尽管这是一个更大的解决方案,还涉及您不需要的自定义过滤器。DAO 提供程序使用一个类UserDetailsService,但也可以创建您自己的类,将功能组合到一个类中。

User不过,重用域类并不是一个好主意UserDetails。即使您实现了该接口,您也会在 HTTP 会话中存储一个断开连接的潜在大型(如果有附加集合)对象。POJO/POGO 实现(Spring Security 的User类、插件的GrailsUser类等)非常小,只有一些字符串和布尔值。