Grails 2.0.2 erschienen

Heute wurde Grails 2.0.2 freigeben. Neben Bugs-Fixes gilt als wichtigste Änderung die Verbesserung des Data-Bindings.

Vor Grails 2.0.2 war das Binden von Parametern in einem Controller für alle Variablen eines (Domain- oder Command-)Objektes möglich. Als Beispiel (sinnvoll oder nicht) diene die Klasse Vendor und der entsprechende Controller:

Das (Sicherheits-)Problem hierbei ist, dass auch Eigenschaften vom invoiceHelper überschrieben werden können, wenn es einen Parameter mit diesem Namen gibt: invoiceHelper.vendorName. InvoiceHelper ist eine durch Spring injizierte Klasse (dynamically typed), deren Eigenschaften nicht geändert werden sollten. Vor Grails 2.0.2 konnte man sich damit helfen, in dem die zu bindenden Variablen in dem Controller explizit angegeben werden:

Seit Grails 2.0.2 werden Eigenschaften dieser Art nicht mehr automatisch gebunden, es sei denn, sie werden in eine sog. white list hinzugefügt. Die Ursache liegt in der Änderung des Ablaufes. Erst nach dem Binden der Parameter werden die Spring-Beans injiziert. Somit können deren Werte nicht mehr (ungewollt) manipuliert werden.
Zudem kann in der Constraint-Closure eines Domain- oder Command-Objektes seit Grails 2.0.2 nun angegeben werden, ob ein Binden des Parameters erlaubt ist oder nicht:

bindable gibt nun an, dass Parameter durch vendor.properties = params nicht mehr automatisch mit gesetzt werden, außer es wird in der white-list mit angegeben:

Links: