2011-02-16 20 views
8

Estoy trabajando en una página que permite a los usuarios editar información de perfil. Quiero que puedan editar su información pública, pero no les permite cambiar las banderas del sistema, como su tipo de usuario.Proteger campos específicos al vincular en Spring

Esto se implementa con Spring MVC (3.0). El objeto Usuario tiene campos típicos como firstName, lastName, email (todo debe ser editable) y un booleano administrator (que no debe ser modificable

Mi método es como la siguiente:.

@RequestMapping(method = RequestMethod.POST) 
public String doEdit(
     @ModelAttribute("user") User user, 
     BindingResult result, 
     ModelMap model) 
throws IOException 
{ 
     // validate, blah blah 
     // save user object 
     // return page 

} 

Mi forma incluye campos firstName, lastName etc., y parecía funcionar bien.

el problema es que si un usuario publica maliciosos una consulta con el parámetro administrator como "verdadero" que puedan establecer este campo cuando shouldn 't.

Sé que puedo crear un objeto "formulario" separado con solo los campos que quiero cambiar y usarlo para el enlace automático. (la copia sobre los datos). El problema es que tengo muchos lugares que usan esta técnica. (para el usuario y otros objetos). Sería una molestia para mantener cuando quiero agregar campos.

¿Hay alguna forma de utilizar anotaciones u otras técnicas en Spring MVC para incluir en la lista de parámetros y evitar cambios en propiedades de objetos de dominio arbitrarios?

+3

sólo una anécdota histórica, la primavera era tan flojo en esta zona, que un usuario malintencionado podría inyectar "class.classLoader.URLs []" a cualquier objeto del modelo, tomando por completo el control del servidor. http://www.springsource.com/security/cve-2010-1622 – irreputable

+1

Estoy estupefacto. Acabo de actualizar de Spring 3.0.2 a Spring 3.0.5 en producción la semana pasada. –

Respuesta

10

El DataBinder tiene dos propiedades llamadas allowedFields y disallowedFields que definen qué (des) permitir el enlace. Sólo tiene que usar eso en su método @InitBinder:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.setDisallowedFields("administrator"); 
} 
+0

¿Hay alguna manera de permitir algunos campos según el rol del usuario que está conectado? –

+0

es código java, por lo que podría hacer esto con la lógica programada if (acl.allowCapability()) –

+0

Nice. Esto suena más flexible, por lo que marcarlo como la respuesta. –

-2

No envíe este parámetro de administrador al lado del cliente, controle en el lado del servidor.

+0

no es un parámetro en sí mismo, es una propiedad del objeto Usuario. Mi pregunta pregunta si hay una manera de ignorar esta propiedad. –

+0

¿Su objeto de modelo de usuario está vinculado a la capa de vista? Algunas personas piensan que es bueno. Yo creo que no. Sin embargo, esta es una pregunta controvertida. Ver http://stackoverflow.com/questions/2680071/dto-or-domain-model-object-in-the-view-layer. Mi comentario continúa cuando usas DTO en oposición a objetos de dominio. – Iogui

3

puede filtrar la solicitud con las expresiones de estilo, para indicar que el parámetro especificado no se supone que debe estar presente en la solicitud "myParam!".

@RequestMapping(params="!administrator") 
+0

agradable. Creo que este o el método initBinder funcionarían. Lástima que no puedo "responder" dos veces. –

Cuestiones relacionadas