Вы также можете рассмотреть возможность использования пользовательского валидатора или объекта ошибок пружины для отлова попыток установить поле перед его сохранением.
РЕДАКТИРОВАТЬ: Вот пример того, что я думал. Вы можете обобщить немного больше, и код здесь не был протестирован, поэтому он, вероятно, не будет работать как есть.
class securedDomain {
String securedField
def fieldSetBy = [:]
def previousValue = [:]
static transients = ['fieldSetBy', 'previousValue']
static constraints = {
securedField(validator: { v, o ->
def access = User.findByName(fieldSetBy['securedField']).hasAccess('securedField')
if(!access) securedField = previousValue['securedField']
return access
})
void setProperty(String name, value) {
if(name == "securedField") {
fieldSetBy['securedField'] = session.user
previousValue['securedField'] = securedField
securedField = value
} else {
super(name, value)
}
}