2010-02-09 5 views
4

J'essaye de configurer un formulaire d'édition pour mon objet User. J'ai une liaison automatique du formulaire à l'objet utilisateur qui fonctionne bien.Spring MVC 3 - Liaison des paramètres à l'objet de support

Je me demande comment puis-je empêcher les utilisateurs malveillants de se lier aux champs de mon objet User que je ne veux pas? Par exemple, mon objet utilisateur a userName et points. Quand ils cliquent sur modifier l'utilisateur, je veux qu'ils puissent changer le userName, mais pas le points. Un utilisateur malveillant peut simplement envoyer un points=429429 supplémentaire en tant que champ masqué dans le formulaire en modifiant le code HTML, ce qui sera automatiquement lié à l'objet de sauvegarde par Spring.

+2

Voir votre question précédente, ils font exactement cette chose avec le champ 'id' utilisant' @ méthode InitBinder' annotée: http://stackoverflow.com/questions/2232095/spring-form-handling-mapping-an-entity-to-form-inputs – axtavt

+0

Bon commentaire, la chose @initbinder est ce que je cherchais. Je l'accepterais comme réponse si je le pouvais. – Kyle

Répondre

4

Je suggère de séparer votre code frontal de la logique de ce qui sera sauvegardé dans la base de données. L'objet de support de formulaire est juste destiné à être un simple objet qui capture ce que l'utilisateur a fait dans la vue ... il ne devrait pas être utilisé pour sauvegarder directement dans la base de données. Je voudrais avoir une couche de service gérer la décision de mettre à jour ou non certains champs ... le contrôleur devrait simplement recevoir l'entrée et la transmettre. De cette façon, le service peut décider quels champs doivent être mis à jour.

public void updateUser(long userId, User updatedUser) { 
    User currentUser = dao.getCurrentUserById(userId); 
    currentUser.userName = updatedUser.username; 
    //...... update anyother fields.... 
    dao.SaveUser(currentUser); 
} 

ou vous pouvez définir la méthode d'une manière que l'appelant sait ce qui sera mise à jour:

public void updateUser(long userId, String updatedUsername); 

Je dirais aussi que cela est beaucoup plus facile de test unitaire si cette logique est la couche de service.

Hope this helps

4

Ajouter à votre contrôleur:

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
binder.setAllowedFields("field1", "field2"); 
} 
Questions connexes