Другой способ сделать это - использовать идентификаторы по умолчанию, как указано, но затем добавить выделенный столбец, используя UUID, когда вам нужен публичный (незащищенный) доступ к элементу.
Я думаю,это будет работать очень хорошо:
class Widget {
String uuid
static constraints = {
uuid unique: true
}
def beforeInsert() {
// optionally, replace the dashes by adding .replaceAll('-','')
uuid = UUID.randomUUID().toString()
}
}
Тогда вы можете использовать контроллер следующим образом:
// url: app/public/widget/48b5451a-0d21-4a36-bcc0-88b129852f1b
PublicController {
def widget() {
Widget w = Widget.findByUuid(params.id)
...
}
}
Он индексируется автоматически, поэтому он не слишком медленный, и UUID используется толькопри публичном поиске виджета.Если у вас есть человек, вошедший в систему, вы можете выполнить проверки безопасности и просто использовать app/widget/edit/1
или что-то подобное.
Я бы не стал полагаться на "случайное число" как на защищенное любым способом.Угадывание чисел работает, даже если числа не последовательные.Угадать UUID практически невозможно, сравнительно.Однако, если у вас есть учетные записи с логином, проверки авторизации лучше всего подходят.