Ndërfaqja ime e internetit ka një thirrje ajax për të përditësuar mbishkrimin e një fotoje. Një postim dërgon titullin dhe ID-në publike të fotografisë në një shërbim.
The service has
Photo photo = Photo.findByPublicId(params.publicId)
photo.caption = params.caption
photo.save()
Megjithatë, unë kam lexuar në librin Grails të Burt Beckwith-it, kjo nuk është e sigurt. Siç është, një haker mund të postojë çdo publicId në shërbimin tim dhe të përditësojë titullin e një fotoje që nuk i përket seancës së tij. Më duhen disa këshilla GORM se si të shkruaj pyetjen e përditësimit për të përditësuar vetëm fotot që i përkasin sesionit aktual të përdoruesit. Për shkak të numrit të bashkimeve të përfshira unë jam i humbur. Jam njohur me marrjen e profilit/përdoruesit:
User user = User.load(springSecurityService.principal.id)
Profile profile = Profile.findByUser(user, [lock:true])
por jo pyetja e vetme që do të bashkonte gjithçka për të gjithë përditësimin, në vend të Profile.findByUser(përdorues, [lock:true]).photoAlbum.getPhotoWherePublicId(publicId) ose diçka që duket se do të bënte 4 thirrje të ndryshme sql.
Skema e domenit që kam me hierarkinë në fjalë është:
//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
}
PhotoAlbum photoAlbum
nuk është e nevojshme në shembullin tuaj 31.10.2013