【问题标题】:Grails SpringSecurity User ObjectGrails SpringSecurity 用户对象
【发布时间】:2012-10-07 06:18:36
【问题描述】:

我有一个与 SpringSecurityCore 插件一起设置的基本 Grails 2 应用程序。这似乎工作正常。但是,当我尝试通过扩展类向我的 User.groovy 文件添加其他属性时,我似乎无法在我的控制器中引用这些属性。

为了更好地说明这个问题,请看一下我扩展 User.groovy 的基本类:

UserInfo.groovy:

class UserInfo extends User {

String firstname
String lastname
}

在我想引用当前用户名的页面上,我只是写了一个方法如下:

def index() { 


        def uname = springSecurityService.currentUser.username
        def firstname = springSecurityService.currentUser.firstname

        render uname

    }

这可以很好地呈现用户名,我相信这是因为在基本 User.groovy 文件中引用了用户名:

class User {

transient springSecurityService

String username
String password

但是,当我尝试将名字定义为 springSecurityService.currentUser.firstname 的一部分时,上述“def index()”方法会失败。

如果我将额外的属性注入到基本 User.groovy 类中,那么我可以通过 springSecurityService.currentUser.[property] 引用它们

为了说明这一点:

class User {

transient springSecurityService

String username
String password
    String firstname
    ...

然后我可以在上述索引方法中引用我的用户的名字属性。

是否可以引用我的用户的扩展属性而不在基用户类中注入值?我的目标是尽量保持 User 类尽可能干净,同时仍然能够调用 UserInfo.groovy 文件中引用的值。

提前感谢您的宝贵时间。

【问题讨论】:

    标签: grails groovy spring-security


    【解决方案1】:

    如果您确实需要将您的用户信息的某些属性放入另一个域,并且希望这些属性仍然可以从 springSecurityService.currentUser 访问,您必须实现自己的UserDetailsService 以将 UserInfo 属性与用户打包。

    【讨论】:

      【解决方案2】:

      如果你扩展 User 类,SpringSecurity 插件不知道你的扩展类 UserInfo

      如果您调用 springSecurityService.currentUser,您会得到 User 的实例,而不是 UserInfo - 所以您没有 firstname 的属性。

      如果您不喜欢向User 添加几个新属性,可以添加对UserInfo 类的引用。

      class UserInfo {
          static belongsTo = [user: User]
      
          String firstname
          String lastname
          ...
      }
      
      class User {
         ...
         UserInfo userInfo
         ... 
      }
      

      您应该记住,此引用向您的数据库添加了一个额外的表,如果您想访问您的用户实例,这会导致额外的连接操作。

      【讨论】:

        【解决方案3】:

        当您最初安装 Spring Security 插件并创建用户类时,它应该在 Config.groovy 中添加一些属性,告诉它使用哪个类作为默认用户类。扩展默认 User 类时,您应该更新 Config.groovy 中的属性以反映这一点。您要更新(如果不存在则添加)的属性如下:

        grails.plugins.springsecurity.userLookup.userDomainClassName = 'your.package.UserInfo'

        如果您扩展/更新任何默认值,您可能希望更新与用户和角色/权限相关的 properties in this page

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-10
          • 1970-01-01
          • 2017-06-21
          • 2013-10-31
          • 1970-01-01
          • 2018-09-27
          • 1970-01-01
          • 2015-03-31
          相关资源
          最近更新 更多