spring security 使用 application/json 接收数据出现的问题 同一用多次登录之后出现能获取到其他用户的数据

标签: 后端  spring boot  java  json

spring security 使用 application/json 接收数据出现的问题 同一用多次登录之后出现能获取到其他用户的数据

问题原帖 https://blog.csdn.net/weixin_34246551/article/details/92173671

原帖是通过继承UsernamePasswordAuthenticationFilter类 ,并重写obtainPassword(HttpServletRequest request)obtainUsername(HttpServletRequest request) 方法来实现获取请求体的json数据,但是启动服务器之后,第一次请求没问题如图
在这里插入图片描述
在这里插入图片描述
是我数据库中的数据没问题,在多次请求之后 并且更换用户之后会出现A用户请求到了B用户的数据,如果尝试了登录错误密码,甚至用正确的账号密码也不会登录成功
在这里插入图片描述

在这里插入图片描述
最开始我以为是框架缓存问题,然后想着没这么离谱吧,然后找啊找,才找到是我之前看的这个帖子的问题
问题出现在这个方法上
在这里插入图片描述
他会读取到之前的登录数据,从而获取的是我之前的数据而不是我最后一次登录的数据

解决方法

查看UsernamePasswordAuthenticationFilter的源代码,发现他获取账号密码最主要是通过attemptAuthentication方法来获取username,password的
在这里插入图片描述
那就不如直接重写attemptAuthentication方法,修改他获取username,和password的方法

	@Override
	public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
	    if (!request.getMethod().equals("POST")) {
	        throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
	    } else {
	        //获取表单数据
	        String username = request.getParameter("username");
	        String password = request.getParameter("password");
	        Map<String, String> bodyParams = null;
	        //如果没获取到表单数据 则尝试读取请求体中的json数据
	        if(username == null && password == null){
	            try {
	                ObjectMapper objectMapper = new ObjectMapper();
	                InputStream is = request.getInputStream();
	                bodyParams = objectMapper.readValue(is, Map.class);
	                if (bodyParams == null) bodyParams = new HashMap<>();
	                username = bodyParams.get("username");
	                password = bodyParams.get("password");
	            } catch (Exception e) {
	                e.printStackTrace();
	            }
	        }
	        if(username == null){
	            username = "";
	        }
	        if(password == null){
	            password = "";
	        }
	        username = username.trim();
	        UsernamePasswordAuthenticationToken authRequest =
	                new UsernamePasswordAuthenticationToken(username, password);
	        this.setDetails(request, authRequest);
	        return this.getAuthenticationManager().authenticate(authRequest);
	    }
	}

使用postman进行多次测试 都是正确的结果 这种写法json请求和form表单提交都可以获取到
在这里插入图片描述

版权声明:本文为Aoikkkk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Aoikkkk/article/details/107870548