Другой способ сделать это было бы использовать идентификаторы по умолчанию, как это предусмотрено, но затем добавить выделенный столбец с помощью 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 почти невозможно, сравнительно. Однако, если у вас есть учетные записи с логином, проверки авторизации лучше всего.
Преимущество последовательных автоматически генерируемых идентификаторов заключается в том, что он уменьшает сложность вставки в кластеризованный индекс. Вызов случайного идентификатора «лучше» субъективен. –
Это можно сделать так: http://danlynn.com/grails/grails-gorm-and-uuids/ –
Я слышал, что UUID может повлиять на производительность. Прежде чем вы выберете его, вы можете захотеть сделать отметку –