我的网络界面有一个 ajax 调用来更新照片的标题。帖子将照片的标题和 publicId 发送到服务。
The service has
Photo photo = Photo.findByPublicId(params.publicId)
photo.caption = params.caption
photo.save()
但是,我在 Burt Beckwith 的 grails 书中读过这并不安全。照原样,黑客可以将任何 publicId 发布到我的服务并更新不属于他们会话的照片的标题。我需要一些关于如何编写更新查询以仅更新属于当前用户会话的照片的 GORM 建议。由于涉及的连接数量,我迷路了。我熟悉获取配置文件/用户:
User user = User.load(springSecurityService.principal.id)
Profile profile = Profile.findByUser(user, [lock:true])
但不是一个查询会加入整个更新的所有内容,而不是 Profile.findByUser(user, [lock:true]).photoAlbum.getPhotoWherePublicId(publicId) 或似乎会进行 4 次不同 sql 调用的东西。
我对相关层次结构的域架构是:
//user from springsecurity for session/login management
class User {
//no reference to profile
}
class Profile {
PhotoAlbum photoAlbum
User user //reference to user
static constraints = {
photoAlbum(nullable:true)
}
}
class PhotoAlbum {
static hasMany = [photos:Photo]
static belongsTo = [profile:Profile]
}
class Photo {
static belongsTo = PhotoAlbum
String caption
String publicId
}