Grails: строка (имя пользователя) в качестве первичного ключа, но сохранить и получить строку идентификатора (имя пользователя) с игнорированием? - PullRequest
0 голосов
/ 12 ноября 2009

Я использую строку "username" в качестве первичного ключа таблицы,

Но при сохранении и получении столбца с идентификатором имени пользователя я хочу, чтобы дело игнорировалось, чтобы новые пользователи не могли попытаться выдать себя за другого пользователя.

например, При регистрации нового пользователя

  • username = Daxon
  • username = DaXoN // это не должно быть разрешено

При получении уникального имени пользователя его можно набрать в любом случае и все же получить. Youtube делают это со своими именами пользователей.

, например

  • youtube.com / пользователя / Daxon
  • youtube.com / user / DaXoN // В любом случае следует перейти на тот же профиль 'Daxon'

Класс домена Это использует имя пользователя в качестве первичного ключа

class User {
  String username
  String password

  static constraints = {
  }

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

Затем я строю контроллеры и представления, Кто-нибудь может мне помочь с сохранением и получением уникальных имен пользователей без учета регистра?

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Один из способов, которым вы можете запретить второму пользователю регистрировать имя, отличающееся только регистром, состоит в создании уникального регистра без учета регистра для имени пользователя на уровне базы данных. Если вы попытаетесь сохранить имя, которое без учета регистра совпадает с существующим, вы получите исключение базы данных. Это значение по умолчанию для 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.

1 голос
/ 12 ноября 2009

Вы можете изменить методы сохранения и получения сгенерированного контроллера для сравнения строк. Перед вставкой имени пользователя вы можете выполнить HQL-запрос, который сравнивает регистр без учета имени пользователя, которое вы хотите вставить, чтобы убедиться, что имя пользователя не существует. См. Раздел «HQL и регистр чувствительности» следующей ссылки. http://dev.wavemaker.com/wiki/bin/view/Dev/HqlTutorial#HCaseInsensitiveQuery

...