【问题标题】:Grails: String(username) as primary key, but save and get id string(username) with ignorecase?Grails:字符串(用户名)作为主键,但使用忽略大小写保存并获取 id 字符串(用户名)?
【发布时间】:2009-11-12 15:04:04
【问题描述】:

我使用字符串“用户名”作为表的主键,

但是在保存和获取带有用户名 id 的列时,我希望忽略大小写,这样新用户就无法尝试冒充另一个用户。

例如注册新用户时

  • 用户名 = Daxon
  • username = DaXoN //这是不允许的

当获得唯一的用户名时,在任何情况下都可以输入它并且仍然可以获得。 Youtube 使用他们的用户名进行此操作。

例如

  • youtube.com/user/Daxon
  • youtube.com/user/DaXoN //无论如何都应该转到“Daxon”的同一个人资料

域类 这使用用户名作为主键

class User {
  String username
  String password

  static constraints = {
  }

  static mapping = {
    id generator: 'assigned', name: "username", type: 'string'
  }
}

然后我搭建控制器和视图, 那么任何人都可以帮助我保存和获取忽略大小写的唯一用户名吗?

【问题讨论】:

    标签: grails groovy primary-key unique


    【解决方案1】:

    您可以防止第二个用户注册一个仅大小写不同的名称的一种方法是在数据库层为用户名创建一个不区分大小写的唯一索引。如果您尝试保存一个不区分大小写与现有名称匹配的名称,您将获得数据库异常。这是 mysql 的默认设置,但对于其他数据库,应该执行以下操作:

    create unique index username_csunique_idx on user(lower(username));
    

    我不知道在域类 DSL 中指定这种索引的任何方法。

    要查找对象,请按用户名不区分大小写进行查询。例如,User.findByUsernameIlike(userName)User.find("from User as u where lower(u.username) = ?", [userName.toLowerCase()]),如果您更喜欢 HQL。

    【讨论】:

    • 我想出了“Ilike”动态方法,很有效。我也从来不知道不区分大小写的索引,我会试试看
    【解决方案2】:

    您可以修改生成的控制器的保存和获取方法来进行字符串比较。在插入用户名之前,您可以执行 HQL 查询,对要插入的用户名进行不区分大小写的比较,以确保不存在任何用户名。请参阅以下链接的“HQL 和区分大小写”部分。 http://dev.wavemaker.com/wiki/bin/view/Dev/HqlTutorial#HCaseInsensitiveQuery

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2015-06-28
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多