[Primavera] parámetro argumentResolver encargo analizador para resolver el problema de la identificación de usuario

[Primavera] parámetro argumentResolver encargo analizador para resolver el problema de la identificación de usuario

entorno del proyecto: Primavera + Spring MVC + Spring Security + Otros

 

sistema desarrollado recientemente en el proceso, hay algún método controlador requiere que el cliente pasar valor ID de usuario.

Obtener un comienzo en LocalStorage almacenada en JS ID de usuario presentada, hay solicitudes susceptibles de ser falsificados.

Dado que el marco usando Spring Security, el usuario puede obtener información directamente a través de la principal, por lo que teniendo en cuenta la seguridad, no ayuda al usuario a realizar el ID de usuario que envía la solicitud, pero la iniciativa para entrar en el ID de usuario del servidor.

SecurityContext sc = SecurityContextHolder.getContext ();
Autenticación auth = sc.getAuthentication ();
LoginUser loginUser = (LoginUser) auth.getPrincipal ();
Entero userID = loginUser.getId ();

 

Pero cada vez que el controlador de Riga este período, el número de controladores de más de uno, el código se vuelve simple, por lo que incluso pensar en el uso de anotaciones de la primavera de resolver.

 

Después de registrarse la información en línea, Spring MVC puede añadir información adicional a través de anotaciones en función, por lo que estos datos pueden ser entregados a añadir anotaciones y el marco para manejar la asignación.

 

El primer paso, anotaciones complemento personalizados, notas nombradas UserId

/ ** 
 * @author qinyuguan
  * /
@Target ({ElementType.PARAMETER})
@Retention (RetentionPolicy.RUNTIME)
@Documented
pública @ interfaz UserId {
     boolean requerido () por defecto  verdadera ;
}

 

El segundo paso, escribir el parámetro de identificación de usuario del analizador

/ ** 
 * @author qinyuguan
 * @Date 15/03/2020 17:21
 * / 
Público  de clase UserIdMethodArgumentResolver implementos HandlerMethodArgumentResolver {

    @Anular
    pública  booleano supportsParameter (MethodParameter parámetros) {
         si (parameter.getParameterType () es igual a (entero.. clase ) && parameter.hasParameterAnnotation (identificación de usuario. clase )) {
             devolver  cierto ;
        }
        volver  falsa ;
    }

    @Anular
    pública resolveArgument Objeto (MethodParameter parámetro, ModelAndViewContainer mavContainer, NativeWebRequest WebRequest, WebDataBinderFactory binderFactory) lanza la excepción {
        UserId currentUserAnnotation = parameter.getParameterAnnotation (UserId. Clase );

        SecurityContext sc = SecurityContextHolder.getContext ();
        Autenticación auth = sc.getAuthentication ();
        LoginUser loginUser = (LoginUser) auth.getPrincipal ();
        Entero userId = loginUser.getId ();
        volver ID de usuario;
    }
}

 

El tercer paso, el registro analizador MvcConfig configuración

/ ** 
 * @author qinyuguan
 * @date 2020/3/15 17:27
 */
@Configuration
public class WebAppConfig{

    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
                argumentResolvers.add(new UserIdMethodArgumentResolver());
            }
        };
    }
}

 

最后,使用,在控制器里随便写一个方法,在参数里添加一个Id的参数,并为其添加@UserId注解:

 

    @GetMapping("/main")
    @ResponseBody
    public Results getInfo(@UserId Integer userId){
        System.out.println(userId);
        return service.getInfo(userId);
    }

 

测试,是否可用,控制台输出了用户ID。

1001

 

Supongo que te gusta

Origin www.cnblogs.com/qinyuguan/p/12498868.html
Recomendado
Clasificación